2014-04-22 86 views
1

情况:我有3个表:C#从多个表中删除行

  • moviespk:movietitle, movielength ....等)
  • rentalspk:personid, fk:movietitle, ...等)
  • rentingpeoplepk+fk:personid, name, phone .. .etc)

在我的表单中有一个列表框绑定与电影标题,旁边的列表框有文本框bindingsourc从db.movies

版当有人点击rentthismovie按钮,我想从表rentalsrentingpeople删除那部电影目前租金数据。

我写的第一部分,并得到因为外键问题的错误(我提到的主键pk和外键如上表中fk

var search = (from g in db.Rentals 
       where g.Movietitle == (string)listBox1.SelectedValue select g).First(); 

db.Rentals.DeleteObject(search); 
db.SaveChanges(); 

我得到一个错误:

The DELETE statement conflicted with the REFERENCE constraint \"FK_Rentingpeople_Rentals\". The conflict occurred in database \"C:\USERS\PC\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\FILMEK\FILMEK\BIN\DEBUG\DATABASE1.MDF\", table \"dbo.Rentingpeople\", column 'personid'.\r\nThe statement has been terminated.

由于主外键连接,我必须从rentingpeople表中删除数据,因为我从这个错误中读取,但我无法真正找到工作解决方案。

+0

你有任何其他的表,其中你保持人是“会员”,并可以租信息,比你'rentingpeople'表等? – Floremin

回答

0

在删除对象本身之前,您需要删除对要删除的对象的所有PK引用和非空引用。
如果逻辑允许,您可以将不可空列更改为可为空的列。

var rentalsToBeDeleted = db.Rentals.Where(o =>o.movieid == movieid).ToList(); 
for (int i = rentalsToBeDeleted.count; i < 0; i--) 
{ 
db.Rentals.DeleteObject(rentalsToBeDeleted.elementAt(i)); 
} 

毕竟引用删除。

db.SaveChanges(); 

写入没有VS,所以错误很可能,但你应该明白了。

+0

所有的东西都允许使用空值,但主键和外键。我找不到从连接到租金PERSONID谁不幸elementsat租所选的动画 – user3551399

+0

和删除rentingpeople删除PERSONID的方式:不包含定义,没有扩展方法... – user3551399

+0

添加到列表的结束db.Rentals.Where(o => o.movi​​eid == movieid).ToList(); –

2

的问题是在数据库设计

movies(pk:movietitle,movielength....etc) 
rentals(pk:personid,fk:movietitle,...etc) 
rentingpeople(pk+fk:personid,name,phone...etc) 

如果我得到这个权利,movies包含电影列表,rentingpeople是谁在租用或租借,并且rentals轨道租赁人的名单。如果是这样,rentingpeople.personid应该是一个PK,和rentals.personid应该是一个FK其他,像这样:

  • 电影(PK:movietitle,movielength ....等)
  • 出租(FK:PERSONID,FK:movietitle,...等)
  • rentingpeople(PK:PERSONID,姓名,电话...等)

,如果你想提高租金(假定任何一个人搜索可以同时行使多个出租),您可以介绍在PERSONID一个非唯一索引,或者PERSONID复合唯一索引上表movietitle rentals

+0

我改变现在我得到的错误:无法更新EntitySet的“租赁”,因为它有一个DefiningQuery并没有元素在元素存在支持当前操作 – user3551399

+0

@ user3551399是否使用EF我认为这是一个。?如果你需要在每个表中都有一个pk,如果是这样的话,在租赁表中放一个PK,例如你可以使'PK(personid,movietitle) – Jason