与 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

如何使用 Entity Framework Code First V6.1.2 进行集成测试