情况:我有3张桌子:
movies
(pk:movietitle, movielength
....等)rentals
(pk:personid, fk:movietitle,
...等)rentingpeople
(pk+fk:personid, name, phone
...等)在我的表单上有一个与电影标题绑定的列表框,列表框旁边有来自db.movies
的文本框绑定源
当有人点击rentthismovie
按钮时,我想从表格rentals
和rentingpeople
中删除有关该电影的当前租借数据。
我写了第一部分并因外键问题而得到错误(我在上表中提到主键为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
表中删除数据,因为我从这个错误读取但我找不到真正有效的解决方案。
答案 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,如下所示:
如果您希望改善租赁搜索(假设任何一个人可以同时进行多次租赁),您可以在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的写作可能会出错,但你应该明白这一点。