EF"元数据集合中不存在具有标识X的成员" (和NopCommerce)

时间:2014-04-30 15:12:45

标签: entity-framework nopcommerce

首先,正如您在标题中所看到的,我正在为nopCommerce设计一个插件。我认为问题与它无关(但与实体框架有关),但我不太确定。

我的插件可以访问数据,而nopCommerce让我创建自己的上下文,创建所需的表和关系。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ParentMap());
    modelBuilder.Configurations.Add(new ChildMap());
}

从概念上讲,我希望拥有的是:

ROOT TABLE ----(1:N)---- CHILDTABLE ----(1:1)---- EXISTING NOPCOMMERCE TABLE

在DB中创建的表和列似乎对我来说是正确的。映射非常简单:

public ParentMap()
{
    ToTable("TableA");

    HasKey(m => m.Id);

    Property(m => m.SomeProperty);

    HasMany(m => m.Child).WithRequired(s => s.Parent).WillCascadeOnDelete();
}

public ChildMap()
{
    ToTable("TableB");

    HasKey(m => new {  m.Id });

    HasRequired(m => m.NopCommerceEntity);

    HasRequired(m => m.Parent);
}

直到这一点,一切似乎都运行良好,事情得到注册,应用程序启动。当我尝试插入或更新与nopCommerce实体有关的任何内容时,我得到以下异常:

"具有身份的成员' Namespace.ChildObject_NopCommerceEntity'元数据集合中不存在。\ r \ nParameter name:identity"。

我一直在想这个问题可能与我在OnModelCreating中没有添加其他映射的事实有关。我试图在那里添加所有相关的映射,但我得到了同样的例外。

有点复杂。我非常感谢你的帮助和帮助。时间:)

2 个答案:

答案 0 :(得分:4)

这是与Entity Framework相关的问题,因为EF不支持跨项目POCO关系。您必须在插件中删除任何具有NopEntities实体的属性,而是使用该实体的Id作为int,如下所示:

public int ProductId { get; set; }

而不是

public virtual Product Product { get; set; }

在映射中,您不应指定实体与Nop之间的关系。

答案 1 :(得分:0)

我认为您仍然可以在子类中使用以下关系


     public int ProductId           { get; set; }
     public virtual Product Product { get; set; } 

但是在保存或更新子类时,而不是设置

child.Product = product

改为设置以下

child.ProductId = product.Id

而且我还认为您的PluginObjectContext插件类继承自NopObjectContext