【问题标题】:Why can I not delete an entity with just .DeleteObject(o)?为什么我不能只用 .DeleteObject(o) 删除实体?
【发布时间】:2012-12-07 10:13:20
【问题描述】:

此代码有效:

var c = cboCustomer.SelectedItem as Customer;
var t = cboTrailer.SelectedItem as Trailer;
using (var db = new CAPSContainer())
{
   db.Attach(c);
   db.Attach(t); 
   c.Trailers.Remove(t);
   db.DeleteObject(t);
   db.SaveChanges();
}

但我不明白为什么我不能这样做:

db.Attach(t);
db.DeleteObject(t);
db.SaveChanges();

如果我尝试,我会得到:

“CAPSContainer.Trailers”中的实体参与“CustomerTrailer”关系。找到 0 个相关的“客户”。预计有 1 个“客户”。

我首先使用的是 EF 5.0 模型,这里是 edmx 图表的一部分:

我很难理解为什么,请帮忙。

更新 1(根据 Boomer 的建议):

            using (var db = new CAPSContainer())
            {
                db.Attach(c);
                //db.Attach(t);
                //c.Trailers.Remove(t);
                db.DeleteObject(t);
                db.SaveChanges();
            }

返回:

无法删除该对象,因为它在 ObjectStateManager 中找不到。

【问题讨论】:

标签: c# linq entity-framework lambda


【解决方案1】:

错误很明显,因为在这种关系中需要客户。这就好像你在数据库中插入一个 Trailer 记录而不指定 CustomerID,你可以在 SQL 中这样做吗?

例如,更好的方法是通过 ID 删除该对象。在这种情况下,您不必在删除之前附加t

using (var db = new CAPSContainer())
{   
    db.DeleteObject(db.Trailers.Where(p => p.ID == t.ID));
    db.SaveChanges();
}

或者在加载所有Trailers(在下拉列表中)时,您还应该获得带有它的Customer 以及附加的任何其他强制实体。

【讨论】:

  • 如果我只是省略 c.Trailers.Remove(t); 我会得到同样的错误...当然我不应该删除预告片,以及两步的关系。
  • 我认为问题出在 db.attach(t) 中
  • 我不是说你删除了 db.attach(t),我告诉你错误来自那个代码,因为附加的实体(即 t)缺少信息,请检查我的回答
  • 嗯,如果它与缺少信息的预告片有关,那么我将不得不加载预告片->预订->工作->请求->项目->用户->权限....要删除的预告片......真是痛苦,就像整个图表一样。
  • 不,当我按 id 执行时,它显示“无法删除该对象,因为它在 ObjectStateManager 中找不到。”即使我附上了它。
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多