此代码有效:
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中找不到该对象。
答案 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
并附加任何其他强制实体。