与 Code First Entity Framework 的单向多对多关系
Posted
技术标签:
【中文标题】与 Code First Entity Framework 的单向多对多关系【英文标题】:unidirectional many-to-many relationship with Code First Entity Framework 【发布时间】:2011-11-15 12:01:44 【问题描述】:我是 EF 新手,并试图通过代码优先方法获得多对多单向关系。例如,如果我有以下两个类(不是我的真实模型),它们之间的关系是 N * N,但“客户”端没有导航属性。
public class User
public int UserId get; set;
public string Email get; set;
public ICollection TaggedCustomers get; set;
public class Customer
public int CustomerId get; set;
public string FirstName get; set;
public string LastName get; set;
映射代码看起来像...
modelBuilder.Entity()
.HasMany(r => r.TaggedCustomers)
.WithMany(c => c.ANavgiationPropertyWhichIDontWant)
.Map(m =>
m.MapLeftKey("UserId");
m.MapRightKey("CustomerId");
m.ToTable("BridgeTableForCustomerAndUser");
);
这种语法迫使我为“客户”实体使用“WithMany”。 以下url 表示“按照惯例,Code First 始终将单向关系解释为一对多。”
是否可以覆盖它,或者我应该使用任何其他方法?
【问题讨论】:
【参考方案1】:使用这个:
public class User
public int UserId get; set;
public string Email get; set;
// You must use generic collection
public virtual ICollection<Customer> TaggedCustomers get; set;
public class Customer
public int CustomerId get; set;
public string FirstName get; set;
public string LastName get; set;
并将其映射为:
modelBuilder.Entity<User>()
.HasMany(r => r.TaggedCustomers)
.WithMany() // No navigation property here
.Map(m =>
m.MapLeftKey("UserId");
m.MapRightKey("CustomerId");
m.ToTable("BridgeTableForCustomerAndUser");
);
【讨论】:
非常感谢,多么简单的解决方案。为了挽回面子,我会把它归咎于缺乏文档,而不是我自己的无知。 属性可以做到这一点吗? @TDaver:不,属性只有在两端都有导航属性并且不希望控制联结表中的名称和列时才能工作。 .WithMany()。 ffs,你能变得更不直观吗? “有很多......什么都没有)”。至少我终于知道该怎么做了,谢谢拉迪斯拉夫!以上是关于与 Code First Entity Framework 的单向多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 5 Code First 到现有 Informix 数据库
Entity Framework 4.1Code First 连接到 Sql Server 2005
Entity Framework学习-实体框架中的code-first迁移
Entity Framework Code-First(10.2):Entity Mappings
Entity Framework Code-First(23):Entity Framework Power Tools