首先,正如您在标题中所看到的,我正在为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中没有添加其他映射的事实有关。我试图在那里添加所有相关的映射,但我得到了同样的例外。
有点复杂。我非常感谢你的帮助和帮助。时间:)
答案 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
。