0

我愿意 :

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

这会从上下文中删除一个trailer对象并推送这些更改。但它失败了,我得到:

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

问题是客户和预告片之间的关系就像---> Customer 1-* Trailer...所以如果我删除预告片,它不应该是一个问题。

那么为什么会出错呢?

编辑:

我尝试了 EF 的 v4 和 4.4 dll。似乎如果我先附加客户,一切正常,但仔细检查表明,即使没有发生错误,拖车仍然存在。

var c = cboCustomer.SelectedItem as Customer;
var t = cboTrailer.SelectedItem as Trailer;

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

PopulateTrailers();

--> 仍然显示在列表中 + 即使在应用重新启动后它仍然存在...

编辑2:

这几乎有效:

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

它给出(第二次删除):

ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

就在我之前在同一个项目中使用单个对象上下文时,这太疯狂了..

MyContext.DeleteObject(t)就是这样。现在同一行替换为 5 行,但仍然存在错误。

4

2 回答 2

2

您可能需要附加与您要删除的预告片相关的客户,以便 EF 也可以删除该关系。

编辑

除了从客户中删除预告片之外,您还需要从上下文中删除它。从客户中删除它只会删除关系。

var c = cboCustomer.SelectedItem as Customer;
var t = cboTrailer.SelectedItem as Trailer;

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

PopulateTrailers();
于 2012-12-06T16:19:49.300 回答
0

加载 cboCustomer 的源元素时,是否包含 Trailer?喜欢:

cboCustomer.Items = db.Customers.Include("Trailers").ToList();

然后删除元素:

using (var db = new CAPSContainer())
{
    db.Attach(c);
    c.Trailers.Remove(t);
    db.SaveChanges();
}
于 2012-12-06T17:49:30.320 回答