1

我正在使用 .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(这是系统中第一个添加的类别)。

我已经尝试了很多方法来解决这个问题,但无法让它发挥作用。任何帮助将不胜感激!

提前非常感谢大家!

4

0 回答 0