EF多对多有两个属性

时间:2012-07-16 10:31:22

标签: entity-framework entity-framework-4.1

我有一个示例代码:

public class Tag
{
    public int TagId { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

当我在我的模型上运行EF(我使用代码优先方法)时,我会在我的数据库中自动创建一些表:

Users
Tags
UserTagUsers <-- junction table for many-to-many relationship

没关系,直到我决定再向用户实体添加一个属性:

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<Tag> Tags2 { get; set; }
}

在这种情况下,EF会生成完全不同的关系,它会删除UserTagUsers联结表,但会为Tags表添加一些其他属性,以便进行一对一映射。

如何明确告诉EF使属性Tags和Tags2成为多对多?

1 个答案:

答案 0 :(得分:1)

使用流畅的API配置映射

    modelBuilder.Entity<User>()
    .HasMany(u => u.Tags).WithMany(t => t.Users)
    .Map(m =>
    {
        m.ToTable("UserTags");
        m.MapLeftKey("UserId");
        m.MapRightKey("TagId");
    });

    modelBuilder.Entity<User>()
    .HasMany(u => u.Tags2).WithMany(t => t.Users2)
    .Map(m =>
    {
        m.ToTable("UserTags2");
        m.MapLeftKey("UserId");
        m.MapRightKey("TagId");
    });