使用Code First Entity Framework实现单向多对多关系

21

我刚接触EF,正在尝试使用代码优先方法建立多对多的单向关系。例如,如果我有以下两个类(不是我的真实模型),它们之间存在N * N的关系,但“Customer”端没有导航属性。

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");
        });

这个语法迫使我在“Customer”实体中拥有“WithMany”。下面的url说:“按照惯例,Code First总是将单向关系解释为一对多。”

是否可以覆盖它,或者我应该使用其他方法?

1个回答

38

使用以下代码:

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");
        });

1
非常感谢,这是一个简单的解决方案。为了保全我的面子,我会把它归咎于缺乏文档而不是我的无知。 - Ajay Bhosale
能用属性实现这个吗? - TDaver
@TDaver:不,属性只有在两端都有导航属性且不希望控制联接表中的名称和列时才能起作用。 - Ladislav Mrnka
. WithMany(). ffs,你还能更不直观吗?“WithMany... nothing)”。至少我终于知道该怎么做了,谢谢Ladislav! - viggity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接