我正在使用带有EF POCO的.NET 4.0。我有一个概念模型,图像中显示了一个部分。一切都很好,除了一件我几乎忙着2天但仍然无法工作的东西!
在我的概念模型中,WebShop可以有一个或多个相关的WebShopCategory实例。每个WebShopCategory都将WebShop与Category相关联,并允许我为WebShop / Category组合指定其他属性。
请参见此处的图片:http://postimage.org/image/djrn4xh37/
当创建新的WebShop实例时,我当然需要保存它,我在WebShopRepository的Update方法中使用EF ObjectContext,如下面的代码所示:
using (MyEntities entities = new MyEntities()) {
if (webShop.ID == 0) {
entities.Countries.Attach(webShop.Country);
foreach (PaymentMethod paymentMethod in webShop.PaymentMethods) {
entities.PaymentMethods.Attach(paymentMethod);
}
foreach (QualityMark qualityMark in webShop.QualityMarks) {
entities.QualityMarks.Attach(qualityMark);
}
foreach (WebShopCategory category in webShop.Categories) {
entities.Categories.Attach(category.Category);
}
entities.WebShops.AddObject(webShop);
}
entities.SaveChanges();
}
需要注意的一点是,数据源中已存在所有相关项。因为它们尚未在ObjectContext中,所以我在将创建的WebShop添加到ObjectContext之前附加了它们。这似乎按预期工作:所有已附加的实体都具有EntityState.Unchaged状态,这是正确的。添加的WebShop处于已添加状态,这也是正确的。
但是,当我附加Category实例(category.Category)时,可能会发生一个异常,说明对象上下文中已经有一个具有相同键的项。我找到了这个ObjectStateEntry实例,我注意到EntityKey只包含EntitySet名称,而不是ID中的ID。已添加到上下文中的其他EntityKeys都采用EntitySetName;ID=value
对我来说,似乎实体密钥在某种程度上不是由EF正确确定的,因为在它出错的地方我已经检查并确保添加的类别确实有效:它是一个已知的类别在系统中,并将其主键(ID)值设置为1(这是系统中第一个添加的类别)。
我已经尝试了很多方法来解决这个问题但却无法解决这个问题。任何帮助将不胜感激!
非常感谢大家!