对不起我糟糕的英语 - 我在 WPF (.net 4.5) 应用程序中使用 EF 5 (Code First)。每个窗口都有自己的上下文。
我有一个这样的模型(为简洁起见省略了代码):
public class Car
{
public string Model { get; set; }
public int BrandId { get; set; }
public virtual Brand Brand { get; set; }
}
我使用组合框来允许用户将 a 关联Brand
到 a Car
。问题是,每次我保存 a时,也会保存Car
一个新的、重复的。Brand
发生这种情况是因为我使用AsNoTracking()
.
现在,我加载了组合框,AsNoTracking()
因为我无法加载Brand
在其他 DbContext 实例中所做的表上的更改(使用myContext.Set<Brand>().Load()
)。
所以我的问题是,如何解决这个问题?如果有另一种强制重新加载集合的方法(不使用AsNoTracking
),那就太好了。更好的是能够通知 EFAsNoTracking
加载的实体不是新的。
编辑1: @Mark:谢谢,将实体附加到上下文就可以了。但是我使用一个通用基类来进行验证并保存我所有表单的数据,因此手动附加实体不是很实用......根据你的建议,我最终这样做了,在添加 Car 实体之后保存它之前:
var entities = (((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added));
foreach (var item in entities)
{
if ((item.Entity as EntityBase).Id > 0)
{
item.ObjectStateManager.ChangeObjectState(item.Entity, EntityState.Unchanged);
}
}
(我所有的实体都继承自 EntityBase,我所有的键都是数据库生成的)。这工作得很好,但我想要第二个意见......这很好还是有更简单的方法来做到这一点?