上篇介绍了一对多关系,下面介绍下多对多关系代码编写。

1、新建model实体,User是用户类,Role是角色类,由于是多对多关系,必须得有一个中间类,所以产生了UserRole类

     public class User
{
public int Id { get; set; }
public string Name { get; set; } public virtual ICollection<UserRole> UserRoles { set; get; }
} public class Role
{
public int Id { get; set; }
public string Name { get; set; } public virtual ICollection<UserRole> UserRoles { set; get; }
} public class UserRole
{
public int Id { get; set; }
public int UId { get; set; }
public int RId { get; set; } public virtual User User { set; get; }
public virtual Role Role { set; get; }
}

2、创建一个EntityContext并继承自DbContext

     public class EntityContext : DbContext
{
public EntityContext()
: base("name=DBConnectionString")
{ } public DbSet<User> User { get; set; }
public DbSet<Role> Role { get; set; }
public DbSet<UserRole> UserRole { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
base.OnModelCreating(modelBuilder);
}
}

3、在web.config文件中添加数据库连接字符串

   <connectionStrings>
<add name="DBConnectionString" connectionString="Data Source=.;Initial Catalog=ManyToMany;Integrated Security=true" providerName="System.Data.SqlClient" />
</connectionStrings>

4、接着创建实体映射

     public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
ToTable("User");
HasKey(u => u.Id);
}
} public class RoleMap : EntityTypeConfiguration<Role>
{
public RoleMap()
{
ToTable("Role");
HasKey(r => r.Id);
}
} public class UserRoleMap : EntityTypeConfiguration<UserRole>
{
public UserRoleMap()
{
ToTable("UserRole");
HasKey(ur => ur.Id); //WillCascadeOnDelete:不使用级联删除
HasRequired(pt => pt.User).WithMany(p => p.UserRoles).HasForeignKey(pt => pt.UId).WillCascadeOnDelete(false); HasRequired(pt => pt.Role).WithMany(t => t.UserRoles).HasForeignKey(pt => pt.RId).WillCascadeOnDelete(false);
}
}

5、我们写一些操作,让Code First生成数据库并验证数据是否新增

     var user = new User() { Name = "Bob" };
db.Set<User>().Add(user); var role = new Role() { Name = "admin" };
db.Set<Role>().Add(role); db.SaveChanges(); var ur = new UserRole() { RId = role.Id, UId = user.Id };
db.Set<UserRole>().Add(ur);
db.SaveChanges(); //var list = db.Set<User>().Include("UserRoles").ToList();
//如果需要查出UserRoles下的Role可以这样
//避免通过延迟加载需要访问数据库(同样的外键实体只会访问一次,但是比较多的话还是用以下方式)
var list = db.Set<User>().Include("UserRoles.Role").ToList();

6、数据库关系图

EntityFramework之多对多关系(四)的更多相关文章

  1. EntityFramework Core2.0 多对多关系配置

    ​ 在EF6.0 中,多对多关系配置时,系统会自动生成第三张表,来将两张有互相约束关系的表联系起来,但是在EF Core2.0中,我们需要手动建立第三张表,比如说有两个模型Passage.cs和Cat ...

  2. EntityFrameWork Code First 多对多关系处理

    场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// ...

  3. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  4. [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例

    本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...

  5. 多对多关系<EntityFramework6.0>

    无负载建立多对多关联的模型 原文中是Modeling a Many-to-Many Relationship with No Payload,虽然这么翻译也有点不准确,但是可以说明其目的,如下图所示, ...

  6. django笔记-模型数据模板呈现过程记录(多对多关系)

    首先,推荐一个网址:http://www.tuicool.com/articles/BfqYz2F,因为这里的比我的要有条理,更有利于各位的理解. 以下仅为为个人一次不完整的笔记: 环境:ubuntu ...

  7. Hibernate一对多和多对一关系详解 (转载)

    :双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side).在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列.     publ ...

  8. 关于hibernate中多对多关系

    关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...

  9. ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

随机推荐

  1. Centos 7.X 安装JDK1.8

    一.查看本机jdk版本并卸载原有openjdk        查看       # java -version       openjdk version "1.8.0_144"  ...

  2. Linux(CentOS)下SVN命令使用实例[转]

    原文出处: http://blog.csdn.net/limingzhong198/article/details/22394809 前言:关于Linux(Unix)系统下的SVN命令使用的文章,在网 ...

  3. 23、php知识点总结基础教程--part-1

    1.基本语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾 <?php // 此处是 PHP 代码 ?> PHP 文件的默认文件扩展 ...

  4. spring 笔记3: Spring 多环境配置文件切换

    使用Spring进行开发时,需要面对不同的运行环境,比如开发环境.测试环境.生产环境等.大多时候不同的环境需要不同的配置文件.网上很多资料都是使用Spring的Bean definition prof ...

  5. python解析复杂json字符串

    因为项目需要,公司领导对提出了接口测试的要求,因此作为一个测试人员,我第一时间就想到了jmeter这个利器,前面文章也有说明过怎么用jmeter做http协议的接口测试,这里我不再做讲解,此篇主要讲解 ...

  6. postman导出excel出现response

    https://jingyan.baidu.com/article/915fc414559b4351394b2084.html

  7. Ubuntu下禁用笔记本自带键盘

    想要禁用笔记本自带键盘(Ubuntu)只要2条命令. 1. 打开终端,输入: xinput list ⎡ Virtual core pointer id=2 [master pointer (3)] ...

  8. [AGC010E] Rearranging [拓扑排序+堆]

    题面 传送门 思路 首先,一个显然的结论是:Alice调整过后的序列中任意两个不互质的数的相对顺序无法改变 那么我们可以以这个性质为突破口 我们在两个不互质的权值的点之间连一条边(没错这是个图论题!! ...

  9. [SDOI2015][bzoj4518] 征途 [斜率优化dp]

    题面 传送门 思路 把$vm^2$展开化一下式子,可以得到这样的等价公式: $vm^2=m\sum_{i=1}^m a_i^2-\sum_{i=1}^m a_i$ 那么我们要最小化的就是$\sum_{ ...

  10. 使用fastJSON解析HashMap中的数据

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entr ...