我已经从数据库创建了一个 Entity Framework 模型。我有多对多关系:User
- UserRole
- Role
。
EF 在 User
实体和 Role
实体中创建了 UserRole
实体和 UserRoles
导航属性,但我宁愿在 User
中有 Roles
,在 Role
中有 Users
。是否可以通过模型设计器进行设计?如何手动配置与中间表的多对多关系?
最佳答案
如果 UserRole 表由用户和角色表的外键以外的列组成,EF 通常会创建中间模型。
因此,如果您在 UserRoles 表中只有 2 列,即用户表和角色表的 FK(甚至不是代理键),EF 会根据需要创建模型。 (没有任何中间模型)因此,这是自动生成所需行为的一种方法。表中只有 2 列。
但是如果你在这张表中还有其他非键列(数据),那么EF的做法是正确的。您需要中间实体。
如果您没有任何非键列,不想再修改您的数据库并且不需要模型中的这个中间表,您可以手动修改 OnModelCreating,以指定多对多并隐藏中间表。
所有步骤如下:
- 从模型层中删除中间表定义 C# 类,以及它在 DbContext 和 User 和 Role 类中的引用。
- 在 User 和 Role 类中为彼此添加一个虚拟 Collection 属性。
例如在用户类中,
public virtual ICollection<Role> Roles { get; set; }
在用户构造函数中
this.Roles = new HashSet<Role>();
// on the OnModelCreating method, add this snippet
modelBuilder.Entity<User>().HasMany<Role>(u => u.Roles)
.WithMany(r => r.Users)
.Map(ru =>
{
ru.MapLeftKey("UserId");
ru.MapRightKey("RoleId");
ru.ToTable("UserRole");
});
关于c# - Entity Framework 数据库首先是多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35527175/