我正在使用 .NET 4.0 和 EF POCO。我有一个概念模型,其中一部分显示在图像中。一切正常,除了一件我几乎忙了 2 天但仍然无法正常工作的事情!
在我的概念模型中,WebShop 可以有一个或多个相关的 WebShopCategory 实例。每个 WebShopCategory 将 WebShop 与 Category 相关联,使我能够为 WebShop/Category 组合指定其他属性。
在此处查看图片:http: //postimage.org/image/djrn4xh37/
在创建新的 WebShop 实例时,我当然需要保存它,我在使用 EF ObjectContext 的 WebShopRepository 的 Update 方法中执行此操作,如下面的代码所示:
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) 时,EF 会给出一个异常,指出对象上下文中已经有一个具有相同键的项目。我找到了这个 ObjectStateEntry 实例,我注意到 EntityKey 只包含 EntitySet 名称,而不是键中的 ID。其他已经添加到 context 的 EntityKeys 的形式都是EntitySetName;ID=value
对我来说,EF似乎无法正确确定实体密钥,因为在出错的地方我已经检查并确保添加的类别确实有效:它是系统中已知的类别并将其主键 (ID) 值设置为 1(这是系统中第一个添加的类别)。
我已经尝试了很多方法来解决这个问题,但无法让它发挥作用。任何帮助将不胜感激!
提前非常感谢大家!