EntityFramework和没有基类的TPT

时间:2012-12-20 13:35:57

标签: c# entity-framework

我们正在使用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表。

1 个答案:

答案 0 :(得分:0)

如果使用Fluent定义ID列的映射,它是否有效?我怀疑EF会允许你定义它,但由于它是一种非标准方法,它不会假设你在这里尝试做什么(因此试图映射到单独的ID列)。你的DbContext类中有这样的东西(我知道这不正确,有人可能会改进):

modelBuilder.Entity<Product>()
            .HasMany(o=>o.MyProperty)
            .Map(o=>o.MapKey("Id"));