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

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. 《Cracking the Coding Interview》——第12章:测试——题目2

    2014-04-24 23:15 题目:你有一段程序,运行了十次每次都在不同的地方崩掉了.已知这段程序只用了标准C或C++库函数,请问有什么思路来找出问题所在. 解法:1. 时间戳每次都不同.2. 随 ...

  2. ADB连接手机遇到的问题:list of devices attached

    今天工作时想尝试一下使用ADB无线连接手机,结果遇到了下面这样的问题,浪费了几十分钟的时间,挺闹心的,因此想分享出来... 首先 第一步:使用USB数据线连接手机,手机弹出选项时,选择仅充电,然后wi ...

  3. 源码分析(一) HashMap 源码分析|JDK8

    HashMap是一个普遍应用于各大JAVA平台的最最最常用的数据结构.<K,V>的存储形式使HashMap备受广大java程序员的喜欢.JDK8中HashMap发生了很大的变化,例如:之前 ...

  4. shell之基本语法

    转:   read 命令从 stdin 获取输入并赋值给 PERSON 变量,最后在 stdout 上输出: #!/bin/bash # Script follows here: echo " ...

  5. HDU 4474 Yet Another Multiple Problem ( BFS + 同余剪枝 )

    没什么巧办法,直接搜就行. 用余数作为每个节点的哈希值. #include <cstdio> #include <cstring> #include <cstdlib&g ...

  6. python 的tempfile学习

    import os import tempfile print "building a file name yourself:" filename = '/tmp/guess_my ...

  7. Nginx主要模块常用指令说明

    核心模块(Core Modules): 主模块(Main Module):配置和服务器全局有关的一些参数,比如错误日志.进程.权限等 user worker_processes error_logsy ...

  8. qemu中是怎么模拟的新的设备

    kvm_cpu_exec 和demo中演示的一样

  9. 使用hadoop统计多个文本中每个单词数目

    程序源码 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Con ...

  10. [CF1036C]Classy Numbers

    题目大意:多个询问,每个询问问$[l,r](1\leqslant l\leqslant r\leqslant10^{18})$内有多少个数满足非零数位小于等于$3$. 题解:数位$DP$,$f_{i, ...