2

我们正在使用 C# MVC .NET4。EF5(代码优先)。

我们正在尝试构建一个系统,该系统应该动态地允许用户将额外的属性“附加”到任何实体。

假设我们有 ProductClass 和 Products。每个实体都有一些“标准”字段,但用户可能决定将任意属性添加到任何记录,作为键值对,例如说 Product 123 有“StockMax”=“10”。

由于我们有许多可能具有“附加”属性的实体(+10),我们将创建单个“附加属性”实体/类(在 SQL 中,它将转换为具有 PK={ParentTable、ParentId、PropertyKey} 的表)。这样,我们将为所有实体的附加属性保留一个类(这将有利于构建用户界面)。

我看到我可以通过拥有一个基类在 EF 中实现这一点:

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 表中。

4

1 回答 1

0

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

modelBuilder.Entity<Product>()
            .HasMany(o=>o.MyProperty)
            .Map(o=>o.MapKey("Id"));
于 2012-12-20T15:45:01.513 回答