因为我不喜欢命名约定,所以entityFramework(代码优先)使用我通常使用foreignKey属性来分配我自己的属性:
public class User {
public virtual Customer Customer { get; set; }
[ForeignKey("Customer")]
public Guid CustomerId { get; set; }
}
工作正常,在“用户”-Table中创建了一个“CustomerId”列。
但是,当我需要多对多的关系时,我如何实现同样的目标?
public class User {
public virtual ICollection<Role> Roles { get; set; }
}
public class Role {
public virtual ICollection<User> Users { get;set; }
}
这会产生一个表“UserRole”,其中包含“User_id”和“Role_Id”。
不过,我更喜欢“UserId”和“RoleId”。我可以自己创建一个UserRole-Class,其中包含对User和Role的引用,但应该有更优雅的方式。有没有?
答案 0 :(得分:2)
您可以使用Fluent Api在您的上下文中配置多对多关系,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany<Role>(u => u.Roles)
.WithMany(c => c.Users)
.Map(cs =>
{
cs.MapLeftKey("UserId");
cs.MapRightKey("RoleId");
cs.ToTable("UserRoles");
});
}
这样,您可以使用所需的名称命名联结表和FK列。
另一种方法是创建一个表示联结表的实体,并与User
和Role
建立两个一对多的关系,但如果您不需要添加额外的列,联结表,建议使用第一个变体,但您可以在此表中明确地找到一些advantages。