如何使用EF优雅的配置一对一的关系
在这两天的时间已经有两位同事问到EF(Code First)如何配置一对一的关系,这个说难也不难,说简单吧,一旦设计跑偏那么在Coding的过程中将会很痛苦。
先举个很简单的例子,两个类User和Profile,User里面存在用户的基本信息比如邮箱和密码,Profile里面存放用户的个人资料。
public class User
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public virtual Profile Profile { get; set; }
}
public class Profile
{
public int Id { get; set; }
public string Name { get; set; }
public Gender Gender { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public virtual User User { get; set; }
}
上面的代码应该是直接了当的。透过领域模型应该能充分描述出User和Profile的业务。分析:对于一个User来说只能有一个Profile(一对一),反过来对于一个Profile来说只能对应一个User(一对一),而且也必须有一个User。下面是通过fluent api做一些映射
public class UserMapping : EntityTypeConfiguration<User>
{
public UserMapping()
{
ToTable("tb_User");
}
}
public class ProfileMapping : EntityTypeConfiguration<Profile>
{
public ProfileMapping()
{
ToTable("tb_Profile");
HasKey(u => u.Id)
.HasRequired(u => u.User) // 对于一个Profile来说必须有一个User否则Profile无家可归
.WithOptional(u => u.Profile) // 同事一个User对应一个Profile 非必须
.WillCascadeOnDelete(false); // 不需要级联删除
}
}
上面的代码也应该也是直接了当的。那么这样生成的数据库结构是什么样的呢?约束又是什么样的呢?又是否符合我们的业务需求

User表没有什么问题,Profile的ID字段不单单是一个主键,同时也是一个外键。我们回到具体的业务中来。当我插入一条User数据的时候要不要插入Profile数据呢?其实是都可以的,如果同时插入的话,User和Profile应该是一起往前走的,而且User的ID和Profile的ID是一样的。那如果插入User的时候不插入Profile呢,其实也没有问题,详细的说明:
假如我插入两条User数据,User表会有两条数据,ID分别为1和2。Profile表为空,没有数据。2用户有一天回过头来想完善自己的个人详细信息,插进去的Profile数据ID应该为2,后来1用户也来完善自己的个人资料,这个时候插入的Profile数据ID为1(虽然2用户先完善的,2用户的ProfileID还是2,1用户的ProfileID还是1)。
static void Main(string[] args)
{
DemoDbContext db = new DemoDbContext();
var user = db.Users.SingleOrDefault(u => u.Id == 2);
Profile profile = new Profile
{
Address = "beijing"
};
user.Profile = profile;
db.SaveChanges();
}
顺便对领域模型唠叨几句:
领域模型是领域驱动设计中最重要的对象,它们是描述我们业务的对象,应该最大力度保持干净,整洁。作为一名开发人员应该多花点时间放在领域的设计上。然而领域的设计应该是和领域专家(产品经理)强度沟通的情况下去完成设计的。比如要做一款财务软件,程序员怎么可能对财务非常精通,都是和财务专家或懂财务的人沟通的基础上去完成我们的领域设计。所以在公司中应确保最好,最有经验的开发人员分配到领域相关的任务上去。
如何使用EF优雅的配置一对一的关系的更多相关文章
- EF Code-First 学习之旅 配置一对一的关系
1对1.1对0 的关系 例如:Entity1与零个或一个Entity2的实例有关系 public class Student { public Student() { } public int Stu ...
- 11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-fi ...
- 9.Configure One-to-One(配置一对一关系)【Code-First系列】
现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键[实际上是一对零或者一对一]. 请注意:一对一的关系,在MS SQL Server中,技术 ...
- 【EF Code First】 一对一、一对多的多重关系配置
这里使用相册Album和图片Picture的关系做示例 1,Album与Picture最基本的关系是1-n(一个相册可以有多张图片) 这时Album.Picture实体类可以这么定义 /// < ...
- 13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code- ...
- 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)
原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...
- 12.翻译系列:EF 6 中配置一对多的关系【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-f ...
- EF实体类配置总结
实体类配置总结 Entity Framework 6 Code First 实践系列(1):实体类配置总结 2014-03-25 12:58 by TJerry, 719 阅读, 6 评论, 收藏, ...
- Habernate配置一对一,一对多,多对多(二)
一.开篇 紧接着上篇的博客来写:http://www.cnblogs.com/WJ--NET/p/7845000.html(habernate环境的搭建) 二.配置一对一 2.1.新建客户类和公司类( ...
随机推荐
- 11.2.0.4 RAC 手动打补丁
1. 下载补丁和最新OPatchGI PSU : p25869727_112040_Linux-x86-64.zipOPatch : p6880880_112000_Linux-x86-64.zip ...
- POJ 1113 Wall (凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- 在drawRect:方法中绘制图片,文字以及Core Graphics 框架的了解
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...
- Spring框架集成mybatis框架的配置(笔记)
<!-- 0.注解扫描 --><!-- 1.导入外部文件 --><!-- 2.数据源 --><!-- 3.session Factory -->< ...
- 在自学java路上遇上的南墙
从2016年12月20号自学java,先是咨询了下培训中心,得小两万,四个月毕业,算了一笔账,一百二十天,合下来每天三百多块,再加上开销之类压力太大,于是开始入坑自学,随后血一般的教训直面而来: 1. ...
- Solr(五)Solr实现简单的类似百度搜索高亮功能-2代码
Solr高亮 一 在配置文件中,配置支持Ik分词器的Field 修改文件: cd /usr/local/tomcat/apache-tomcat-8.5.13/solr_home/Test/conf/ ...
- 67. Add Binary【LeetCode】
67. Add Binary Given two binary strings, return their sum (also a binary string). For example,a = &q ...
- 【CPP】数据和C
%f是浮点型的占位符,%f.2表示显示到小数点后两位,.2称为修饰词 变量可以在程序执行过程中变化和指定,而常量不可以. [数据类型关键字]int long short unsigned char ...
- Java 冒泡排序的实现
实现原理: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除 ...
- CentOS 6.5安装JDK、Tomcat、Mysql
安装JDK 1.下载JDK7 下载jdk-7u79-linux-x64.tar.gz 百度网盘下载地址:https://pan.baidu.com/s/1c1JZo2k 在Linux上新建/usr/j ...