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.一对一关联的更多相关文章

  1. EF – 6.一对一关联

    5.6.6 <一对一关联概述>  5.6.7 <一对一关联CRUD演示>  在两讲视频中,首先介绍了数据库中一对一关联表的设计规范,接着通过实例介绍了如何合适Entity Fr ...

  2. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  3. Hibernate中的一对一关联

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

  4. Hibernate一对一关联映射配置

    一.一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1 ...

  5. Hibernate之映射一对一关联

    一.一对一关联的概念: 一对一之间的关联是指:两张表中的信息是一对一的关系,比如我们每个人和身份证的关系,一个人对应一张身份证,一张身份证也只能对应一个人. Hibernate提供了两种映射一对一关联 ...

  6. Hibernate中一对一关联映射/组件映射

    Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...

  7. Hibernate中的一对一关联和组件的映射

    Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...

  8. 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句

    如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...

  9. 04.Hibernate一对一关联

        前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系     本文根据客户信息表(tb_customer)和地址信 ...

随机推荐

  1. linux设置开机自动启动

    有很多中方法,这里只取最简单的一种: 把启动命令放到/etc/rc.d/rc.local文件里这样就可以每次启动的时候自动启动服务了, 注意给rc.local执行权限

  2. hadoop(五)HDFS原理剖析

    一.HDFS的工作机制 工作机制的学习主要是为加深对分布式系统的理解,以及增强遇到各种问题时的分析解决能 力,形成一定的集群运维能力PS:很多不是真正理解 hadoop 工作原理的人会常常觉得 HDF ...

  3. 【CF123E】Maze

    Portal --> cf123E Solution 首先步数的话可以转化成每条边经过了几次这样来算 假设现在确定了起点\(S\)和终点\(T\),我们将\(T\)看成树根,那么考虑边\((u, ...

  4. Cyrus SASL介绍(翻译)

    http://blog.sina.com.cn/s/blog_7695e9f40100pnpa.html Cyrus SASL介绍 1. 综述 这篇文档讲述的是系统管理员配置SASL的方法,其中详细的 ...

  5. Python --Redis Hash操作

    一.Redis Hash操作 Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40 ...

  6. McNemar test麦克尼马尔检验

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  7. kvm虚拟机配置被克隆rhel6客户机的网卡

    例子:配置被克隆rhel6客户机的网卡 rhel6的网卡是通过udev规则来进行命名每个网卡都有不一样的macudev规则是根据网卡的mac来进行识别克隆出来的客户机,为了遵守每个网卡的mac都是全球 ...

  8. centos 7 pdo

    在windows本机上测试好的Thinkphp5代码部署到centos7阿里云主机上面就提示class pdo not found,网上搜索了一大堆终于解决了.不过隔了这么几个小时详细的步骤就有些忘记 ...

  9. Lucene 索引与检索架构图

  10. c++数组遍历十种方式

    int ia[3][4] = {1,2,3,4,5,6,7,8}; //下标 for (int i = 0; i < 3; i++) {     for (int j = 0; j < 4 ...