【问题标题】:C# Delete row from multiple tablesC#从多个表中删除行
【发布时间】:2014-04-22 15:09:09
【问题描述】:

情况:我有3张桌子:

  • movies (pk:movietitle, movielength....等)
  • rentals (pk:personid, fk:movietitle,...等)
  • rentingpeople (pk+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 表中删除数据,因为我从这个错误中读取,但我真的找不到有效的解决方案。

【问题讨论】:

  • 除了rentingpeople 表之外,您是否还有其他表可以保存“会员”且可以租用的人员的信息?

标签: c# database linq mdf


【解决方案1】:

问题出在数据库设计中

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,...等)
  • 租用人员(pk:personid、姓名、电话...等)

如果您想改进对租赁的搜索(假设任何人可以同时执行多个租赁),您可以在 personid 上引入非唯一索引,或在表 rentals 上为 personid 和 movietitle 引入复合唯一索引

【讨论】:

  • 我现在改变了,我得到了错误:无法更新 EntitySet 'Rentals',因为它有一个 DefiningQuery 并且 元素中不存在 元素来支持当前操作。跨度>
  • @user3551399 你在使用 EF 吗?我认为 ef 的问题是你需要在每个表中都有一个 pk,如果是这种情况,请将一个 PK 放在 Rentals 表中,例如你可以制作PK(personid, movietitle)
【解决方案2】:

在删除对象本身之前,您需要删除对要删除的对象的所有 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 的情况下写作,所以很可能会出错,但你应该明白。

【讨论】:

  • 一切都允许空值,但主键和外键除外。我找不到从与租借所选电影的租借人员相关联的租借人员中删除人员标识的方法
  • 不幸的是elementsat和delete:不包含定义和扩展方法......
  • 添加到列表末尾的 db.Rentals.Where(o =>o.movi​​eid == movieid).ToList();
  • still.. :( 反正我改成了 o.movi​​eid==listbox1.selectedvalu 或者它也被红色下划线,我需要搜索 selectedmovie
  • hm 现在代码清理干净了,但没有删除任何内容 :( 现在我在出租表中有 3 个相同的电影标题,没有一个被删除
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多