我正在构建一个域模型,它要求多个表能够被多个可能的父表引用。您可能有一个表来存储注释或文件,这些注释和/或文件可以与不同的父实体相关联。并不是说同一个"file“或"note”可以与多个所有者相关联,而是"files“表中的10行,其中3行可能归"Customer”表中的行所有,3行可能归"Orders“表中的行所有,4行可能归"Person”表中的行所有。
所属表都有子表的虚拟ICollections。
当我为初始迁移运行代码优先迁移模型并查看生成的流畅代码时,这些表的表定义包括多个id列,这些列引用回源表,因此将有一个列"customer_id“、"person_id”等(每个可能的“拥有实体”对应一个列。这看起来不太“正确”。有没有更好的方法用CodeFirst在EF中对此进行建模?比如能够使用子表中的鉴别器列来提供有关所属实体的“提示”?
谢谢,-MrB
发布于 2012-10-21 03:30:52
如果在注解和所有可以具有注解的实体之间创建多对多关系,则每个拥有类型都将有一个连接表和一个简洁的注释表。创建多对多关系的最简单方法是覆盖DbContext.OnModelCreating
方法。
您的DbContext:
public class MyDatabase : DbContext
{
// Protected methods
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>().HasMany(x => x.Notes).WithMany();
modelBuilder.Entity<Order>().HasMany(x => x.Notes).WithMany();
}
public MyDatabase() : base("MyDatabase")
{
}
// Properties
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Note> Notes { get; set; }
}
这将生成以下表:Customer、Orders、Notes、CustomerNotes和OrderNotes,最后两个是连接表,每个表只有两列。
注意!使用此解决方案,实体也可以共享备注,例如,客户和订单可以拥有相同的备注。
发布于 2012-10-21 03:06:40
不确定是否合适,但您可以使用EF层次结构来实现。请参阅本文:
http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx
基本上,你的笔记可以有三种类型,它们都继承自一个基本的笔记类型。
EF中有三种层次结构,所以这篇文章分为三部分……
https://stackoverflow.com/questions/12961148
复制相似问题