ObjectContext.Attach生成不正确的实体密钥

时间:2013-01-28 20:03:32

标签: entity-framework

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

我已经尝试了很多方法来解决这个问题但却无法解决这个问题。任何帮助将不胜感激!

非常感谢大家!

0 个答案:

没有答案