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

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、数据库关系图

最新文章

  1. [LeetCode] Peeking Iterator 顶端迭代器
  2. Web前端之jQuery 的10大操作技巧
  3. Spark高级数据分析中文版-读者交流
  4. [MySQL][Spider][VP]Spider-3.1 VP-1.0 发布
  5. 单页Web应用:
  6. UserControl eventhander 注册问题
  7. bzoj 2707 [SDOI2012]走迷宫(SCC+高斯消元)
  8. jquery跨域访问解决方案(转)
  9. OC-Objection 学习笔记之一:简单的开始
  10. 【每天一道算法题】Numeric Keypad
  11. iOS开发--SQLite重要框架FMDB的使用
  12. Finance财务软件(引入业务系统凭证专题)
  13. Elasticsearch snapshot 备份的使用方法 【备忘】
  14. msimg32.lib不用为绝对路径发愁
  15. centos磁盘空间重新分配
  16. 同步代码时忽略maven项目 target目录
  17. mysql中LIKE和REGEXP
  18. json、jsonp的定义和区别
  19. Hibernate学习第三天(2)(多对多关系映射)
  20. C# 安装WindowService服务和相关

热门文章

  1. 示例解读Java的跨平台原理
  2. TW实习日记:第四天
  3. Python全栈 MySQL 数据库 (简述 、安装、基本命令)
  4. cloud.cfg_for_ubuntu
  5. CSU-2214 Sequence Magic
  6. shell之进程
  7. OpenFlow-Enaling innvation in Campus Networks
  8. 一个自动安装LNMP的简洁Shell脚本
  9. 【bzoj4177】Mike的农场 网络流最小割
  10. NBUT校赛 J Alex’s Foolish Function(分块+延迟标记)