我们正在使用C#MVC .NET4。 EF5(CodeFirst)。
我们正在尝试构建一个系统,该系统应该动态地允许用户将额外的属性“附加”到任何实体。
假设我们有ProductClass和Products。我们为每个实体都有一些“标准”字段,但是用户可能决定将任意属性添加到任何记录,作为键值对,就像说产品123具有“StockMax”=“10”。
由于我们有许多可能具有“附加”属性的实体(+10),我们将创建单个“AttachedProperty”实体/类(在SQL中将转换为PK = {ParentTable,ParentId,PropertyKey}的表) 。这样我们就可以为所有实体的附加属性保留一个类(这对于构建用户界面很有用)。
我看到我可以通过拥有基类来实现这一目标:
class EntityWithAttachableProperty {
public System.Guid Id {get;set;}
public ICollection<MyProperty> MyProperties {get;set;}
}
然后从该类继承到我的实体,例如:
class Product : EntityWithAttachableProperties {
public string name {get;set;}
etc
}
我的问题是我不想为此使用继承。我会被迫逻辑地分组那些与之无关的东西。我还会在SQL中获得一个我不需要的庞大的EntityWithAttachableProperties表。
那么,有没有办法在没有基类的情况下完成TPT? (也许通过模型制造商)。这样我就会得到这样的课程:
class Product {
public System.Guid Id {get;set;}
public string name {get;set;}
public ICollection<MyProperty> MyProperties {get;set;}
etc
}
class ProductClass {
public System.Guid Id {get;set;}
public string Classname {get;set;}
public ICollection<MyProperty> MyProperties {get;set;}
etc
}
请注意,当我这样做时,EF会尝试将Product_Id和ProductClass_Id添加到MyProperties表。
答案 0 :(得分:0)
如果使用Fluent定义ID列的映射,它是否有效?我怀疑EF会允许你定义它,但由于它是一种非标准方法,它不会假设你在这里尝试做什么(因此试图映射到单独的ID列)。你的DbContext类中有这样的东西(我知道这不正确,有人可能会改进):
modelBuilder.Entity<Product>()
.HasMany(o=>o.MyProperty)
.Map(o=>o.MapKey("Id"));