c# - Entity Framework 数据库首先是多对多

标签 c# sql database entity-framework many-to-many

我已经从数据库创建了一个 Entity Framework 模型。我有多对多关系:User - UserRole - Role

EF 在 User 实体和 Role 实体中创建了 UserRole 实体和 UserRoles 导航属性,但我宁愿在 User 中有 Roles,在 Role 中有 Users。是否可以通过模型设计器进行设计?如何手动配置与中间表的多对多关系?

最佳答案

如果 UserRole 表由用户和角色表的外键以外的列组成,EF 通常会创建中间模型。

因此,如果您在 UserRoles 表中只有 2 列,即用户表和角色表的 FK(甚至不是代理键),EF 会根据需要创建模型。 (没有任何中间模型)因此,这是自动生成所需行为的一种方法。表中只有 2 列。

但是如果你在这张表中还有其他非键列(数据),那么EF的做法是正确的。您需要中间实体。

如果您没有任何非键列,不想再修改您的数据库并且不需要模型中的这个中间表,您可以手动修改 OnModelCreating,以指定多对多并隐藏中间表。

所有步骤如下:

  1. 从模型层中删除中间表定义 C# 类,以及它在 DbContext 和 User 和 Role 类中的引用。
  2. 在 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/

相关文章:

mysql - 使用 sum 子句按日期排序

MYSQL delete - 表 'USER_TABLE' 被指定两次,既作为 'DELETE' 的目标,又作为单独的数据源

Django 2.0 使用脚本填充数据库

c# - 实现具有通用约束的接口(interface)

c# - Linq 从对象属性列表中获取新列表,该对象属性列表本身就是一个列表

java - 将应用程序从 Oracle 更改为 Hadoop

php - MySQL循环遍历列

c# - 为什么我不能将具体类型列表分配给该具体接口(interface)的列表?

c# - 徽章/成就

mysql - Magento - 如何按最大值选择mysql行?