Entity Framework 数据库优先多对多
Entity Framework Database First many-to-many
我已经从数据库创建了一个 Entity Framework 模型。我有多对多关系:User
- UserRole
- Role
。
EF 在 User
实体和 Role
实体中创建了 UserRole
实体和 UserRoles
导航 属性,但我宁愿 [= User
中的 18=] 和 Role
中的 Users
。是否可以通过模型设计器进行设计?如何手动配置中间有一个 table 的多对多关系?
如果 UserRole table 包含用户和角色 table 的外键以外的列,EF 通常会创建中间模型。
因此,如果您在 UserRoles table 中只有 2 列,用户和角色的外键 tables(甚至不是代理键),EF 将根据需要创建模型. (没有任何中间模型)因此,这是自动生成所需行为的一种方法。 table.
中只有 2 列
但是如果你在这个 table 中有其他非键列(数据),那么 EF 所做的是正确的。您需要中间实体。
并且在您没有任何非键列的情况下,不想再修改您的数据库并且在您的模型中不需要这个中间 table,您可以手动修改OnModelCreating,指定Many-to-Many并隐藏中间table.
以下是所有步骤:
- 从模型层删除中间 table 定义 C# class,以及它在 DbContext 和 User 和 Role classes 中的引用。
- 在用户和角色 class 中为彼此添加一个虚拟集合 属性。
例如在用户 class,
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");
});
我已经从数据库创建了一个 Entity Framework 模型。我有多对多关系:User
- UserRole
- Role
。
EF 在 User
实体和 Role
实体中创建了 UserRole
实体和 UserRoles
导航 属性,但我宁愿 [= User
中的 18=] 和 Role
中的 Users
。是否可以通过模型设计器进行设计?如何手动配置中间有一个 table 的多对多关系?
如果 UserRole table 包含用户和角色 table 的外键以外的列,EF 通常会创建中间模型。
因此,如果您在 UserRoles table 中只有 2 列,用户和角色的外键 tables(甚至不是代理键),EF 将根据需要创建模型. (没有任何中间模型)因此,这是自动生成所需行为的一种方法。 table.
中只有 2 列但是如果你在这个 table 中有其他非键列(数据),那么 EF 所做的是正确的。您需要中间实体。
并且在您没有任何非键列的情况下,不想再修改您的数据库并且在您的模型中不需要这个中间 table,您可以手动修改OnModelCreating,指定Many-to-Many并隐藏中间table.
以下是所有步骤:
- 从模型层删除中间 table 定义 C# class,以及它在 DbContext 和 User 和 Role classes 中的引用。
- 在用户和角色 class 中为彼此添加一个虚拟集合 属性。
例如在用户 class,
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");
});