EF – 6.一对一关联
5.6.6 《一对一关联概述》
5.6.7 《一对一关联CRUD演示》
在两讲视频中,首先介绍了数据库中一对一关联表的设计规范,接着通过实例介绍了如何合适Entity Framework针对一对一关联的数据实体对象进行增删改操作。
5.6.6 《一对一关联概述》

5.6.7 《一对一关联CRUD演示》 时长:11分53秒 难度:中
在两讲视频中,首先介绍了数据库中一对一关联表的设计规范,接着通过实例介绍了如何合适Entity Framework针对一对一关联的数据实体对象进行增删改操作。
创建对象的方法
public Person CreatePersonWithoutIdentityCard()
{
Person person = new Person() { Name = "ane" };
return person;
} public IdentityCard CreateIndentityCard()
{
IdentityCard card = new IdentityCard() { IDNumber = 1 };
return card;
}
方法一:在内存中创建好主从对象,并且通过导航属性关联,然后SaveChange()
/// <summary>
/// 主对象都是全新的,在内存中关联,然后同事写入数据库
/// 会生成两条SQL命令,
/// 第一条插入主对象得到ID,然后再使用此ID设置对象,然后插入
/// </summary>
[TestMethod]
public void TestAdd()
{
//1.1.创建一个Person对象,引用唯一的IdentityCard,并且插入数据
Person person = CreatePersonWithoutIdentityCard();
person.IdentityCard = CreateIndentityCard();
//追加到DbSet
context.Person.Add(person); //1.2.保存向数据库发送2条SQL命令.
//第一次为插入Person,返回主键.
//第二次用返回的主键插入IdentityCard.
int result = context.SaveChanges(); //1.3.共保存2条数据,所以result == 2
Assert.IsTrue(result == 2);
}
方法二:从数据库中装入主对象,new一个从对象,关联上主对象,然后SaveChange()
/// <summary>
/// 主对象是“老的”,从对象是“新”的,在内存中关联,然后写入数据库
/// </summary>
[TestMethod]
public void TestAdd2()
{
//2.1.创建一个Person对象,引用唯一的IdentityCard,并且插入数据
Person person = CreatePersonWithoutIdentityCard();
//追加到DbSet
context.Person.Add(person);
int result = context.SaveChanges();
Assert.IsTrue(result == 1); //2.2.创建一个新的从对象,并关联主对象
person.IdentityCard = CreateIndentityCard();
result = context.SaveChanges();
//共保存1条数据,所以result == 1
Assert.IsTrue(result == 1); //2.3.重新装入主从对象,现在两个对象应该都不为null
Person personFromDB = context.Person.Include("IdentityCard")
.FirstOrDefault(p => p.PersonID == person.PersonID);
Assert.IsNotNull(personFromDB);
Assert.IsNotNull(personFromDB.IdentityCard);
}
错误方法:
/// <summary>
/// 单独创建一个从对象,试图插入数据库,将会报告DbUpdateException异常
/// 最终数据没有插入,所以,“永远不要在一对一关联中单独插入从对象”
/// </summary>
[TestMethod]
//[ExpectedException(typeof(DbUpdateException))]
public void TestAdd3()
{
//3.1 创建一个“独立的”从对象
IdentityCard idCard = CreateIndentityCard();
//获取主键
int maxId = context.IdentityCard.Max(id => id.IdentityCardId);
idCard.IdentityCardId = maxId + 1;
//追加到DbSet
context.IdentityCard.Add(idCard);
//由于对应的主记录不存在,所以插入数据失败
int result = context.SaveChanges();
//此断言永远不可能被满足
Assert.IsTrue(result > 0);
}

删除对象:

修改对象:

EF – 6.一对一关联的更多相关文章
- EF – 6.一对一关联
5.6.6 <一对一关联概述> 5.6.7 <一对一关联CRUD演示> 在两讲视频中,首先介绍了数据库中一对一关联表的设计规范,接着通过实例介绍了如何合适Entity Fr ...
- EF里一对一、一对多、多对多关系的配置和级联删除
本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...
- Hibernate中的一对一关联
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
- Hibernate一对一关联映射配置
一.一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1 ...
- Hibernate之映射一对一关联
一.一对一关联的概念: 一对一之间的关联是指:两张表中的信息是一对一的关系,比如我们每个人和身份证的关系,一个人对应一张身份证,一张身份证也只能对应一个人. Hibernate提供了两种映射一对一关联 ...
- Hibernate中一对一关联映射/组件映射
Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...
- Hibernate中的一对一关联和组件的映射
Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...
- 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句
如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...
- 04.Hibernate一对一关联
前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系 本文根据客户信息表(tb_customer)和地址信 ...
随机推荐
- DMZ
DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”.它是为了解决安装防火墙后外部网络的访问用户不能访问内部网络服务器的问题,而设立的一个非安全系统与安 ...
- Delphi Dll 消息处理
转载:http://blog.csdn.net/lailai186/article/details/8770643 事情的导火线是GIF图片的显示. 在应用程序中, 利用三方的GIFImage.pas ...
- PyQt4 QListview控件使用方法
1.往QListView控件内写入数据 strlist=QStringList()strlist.append('hello')strm=QStringListModel(strlist)self.u ...
- C语言宏定义时#(井号)和##(双井号)的用法1
#在英语里面叫做 pound 在C语言的宏定义中,一个#表示字符串化:两个#代表concatenate 举例如下: #include <iostream> void quit_comman ...
- 【Networking】k8s容器网络 && golang相关
Bookmarks flannel/proxy.c at master · coreos/flannel kubernetes/kubernetes: Production-Grade Contain ...
- 【leetcode】First Missing Positive
First Missing Positive Given an unsorted integer array, find the first missing positive integer. For ...
- Appium+Robotframework实现Android应用的自动化测试-6:一个简单的例子
万事具备,只欠编码! 下面看一个简单的示例,这个示例验证Android手机自带的通讯录的添加联系人的操作是否成功.这个例子是Appium官网自带的示例,有兴趣的同学也可以自己下载来研究和学习,下载地址 ...
- iOS 活动图 流程图
活动图 活动图和状态机图都被称为演化图,其区别和联系如下: 1.活动图:用于描述用例内部的活动或方法的流程,如果除去活动图中的并行活动描述以后,它就变成流程图. ...
- ios Unit test 入门书籍推荐
请参考 ios 7 by tutorials 中的 chapter 11 :Unit Testing in xcode 5
- Android状态栏微技巧,带你真正意义上的沉浸式
记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...