我有一个示例代码:
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成为多对多?
答案 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");
});