C#从多个表中删除行

时间:2014-04-22 15:09:09

标签: c# database linq mdf

情况:我有3张桌子:

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

在我的表单上有一个与电影标题绑定的列表框,列表框旁边有来自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();

我收到错误:

  

DELETE语句与REFERENCE约束\“FK_Rentingpeople_Rentals \”冲突。冲突发生在数据库\“C:\ USERS \ PC \ DOCUMENTS \ VISUAL STUDIO 2010 \ PROJECTS \ FILMEK \ FILMEK \ BIN \ DEBUG \ DATABASE1.MDF \”,表\“dbo.Rentingpeople \”,列'personid'。 \ r \ n该声明已被终止。

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

2 个答案:

答案 0 :(得分:2)

问题在于db设计

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

如果我说得对,movies包含电影列表,rentingpeople是租借或租借的人员列表,rentals跟踪租借。如果是这样, rentingpeople.personid 应该是pk, rental.personid 应该是另一个fk,如下所示:

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

如果您希望改善租赁搜索(假设任何一个人可以同时进行多次租赁),您可以在personid上引入非唯一索引,或者在表{{1}上为personid和movietitle引入复合唯一索引}}

答案 1 :(得分: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的写作可能会出错,但你应该明白这一点。