为什么我不能删除只有.DeleteObject(o)的实体?

时间:2012-12-07 10:13:20

标签: c# linq entity-framework lambda

此代码有效:

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图的一部分:

enter image description here

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

更新1(如Boomer所建议):

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

返回:

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

1 个答案:

答案 0 :(得分: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并附加任何其他强制实体。