博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)
阅读量:7008 次
发布时间:2019-06-28

本文共 2094 字,大约阅读时间需要 6 分钟。

    通常我们在做数据库设计时都会有两张表是多对多关系的时候,在数据库做多对多关系时候我们通常通过中间关联表来处理,那我们现在在EF中是如何处理的呢?

    假设我们有如下关系,用户(User)包含多个角色(Role),角色包含多个用户的情况下,我们如何用EF来处理这样的数据库设计呢?

接下来看如下代码清单:

首先看我们的UserRole实体

1 public class User 2  3 { 4  5     public User() {} 6  7   8  9     public int UserId { get; set; }10 11     public string Name { get; set; }12 13     public string Password { get; set; }14 15     public string PasswordSalt { get; set; }16 17     public Byte Status { get; set; }18 19     public DateTime CreatedDate { get; set; }20 21     public DateTime ModifiedDate { get; set; }22 23 }24 25 public class Role26 27 {28 29      public Role() {}30 31      public int RoleId { get; set; }32 33      public string RoleName { get; set; }34 35 }

接下来,我们知道用户包含多个角色,那么在User实体中添加这样的代码

public virtual ICollection
Roles { get; set; }

 

User的构造函数中添加这样代码

this.Roles = new HashSet
();

 

同样的,角色也包含多个用户,那么在Role实体中添加这样代码

public virtual ICollection
Users { get; set; }

 

Role构造函数中添加这样代码

this.Users = new HashSet
();

 

接下来,构造我们继承自DbContext类的DataContext

public class DataContext : DbContext{    public DataContext()        : base("DataContext")    {    }    public DbSet
Users { get; set; } public DbSet
Roles { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { }}

 

接着,我们生成我们项目,就可以看到我们生成的数据库关系了

可以看到我们中间的链接表生成的是User_UserIdRole_RoleId,但实际工作中我们可能不会这样定义或者希望可以更多定制化,接下来我们通过Fluent API(注:我这里直译为流畅的API声明,大家可以看字面意思理解,我不一定对)方式来进行数据声明,我们这里关系是一个用户可以包含多个角色,一个角色也可以包含多个用户,那我们在DataContextOnModelCreating重载方法里这样写:

modelBuilder.Entity
() .HasMany(r => r.Roles).WithMany(u => u.Users);

 

进一步我们指定中间链接表

modelBuilder.Entity
() .HasMany(r => r.Roles) .WithMany(u => u.Users) .Map(ur => { ur.MapLeftKey("UserId"); ur.MapRightKey("RoleId"); ur.ToTable("UserRoles"); });

 

参考资料:

http://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html

转载于:https://www.cnblogs.com/bestfriends/p/6721865.html

你可能感兴趣的文章
oracle编码转换:AL32UTF8->ZHS16GBK
查看>>
Unity Update 具体解释
查看>>
T-SQL动态查询(4)——动态SQL
查看>>
Ubuntu 16.04安装uGet替代迅雷,并在Chrome中设置为默认下载器
查看>>
MySQL缓存之Qcache与buffer pool对比
查看>>
springmvc(一) springmvc框架原理分析和简单入门程序
查看>>
别踩白块儿
查看>>
跟面试官讲Binder(零)
查看>>
mahout in Action2.2-聚类介绍-K-means聚类算法
查看>>
bootstrap-treeview 如何实现全选父节点下所有子节点及反选
查看>>
HTML5 CSS3 诱人的实例: 3D立方体旋转动画
查看>>
ElasticSearchserver操作命令
查看>>
ThreadPoolExecutor异常处理
查看>>
LeetCode 第 342 题(Power of Four)
查看>>
用QT搭建简单的播放器外壳
查看>>
索引设计指南
查看>>
Timus Online Judge 1057. Amount of Degrees(数位dp)
查看>>
jquery中关于表格行的增删问题
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
GUI进化--数据与界面分离
查看>>