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. SNMP详解

    简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单性,在Inter ...

  2. Sqli-LABS通关笔录-17-审计SQL注入

    这个关卡开始好像进入新的知识区了,前面几个是让我们加深对盲注的印象.接下来又是新知识了!皮卡丘,接招吧! 代码是从SQL-libs的第十七关卡扣的. 页面效果如下所示: PHP面完整CODE如下所示: ...

  3. 全部springxml文件约束 applicationContext.xml

    <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.sp ...

  4. 【架构】linkerd:来自Twitter为微服务而生的开源RPC解决方案

    大家要如何以规模化方式运维微服务应用程序?实践当中会出现哪些问题,我们又该如何加以解决?在大规模与非预测性工作负载场景当中,我们需要满足哪些条件才能运行一款大型微服务应用程序,而又能够确保不必受到功能 ...

  5. C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)

    数组是变量的索引列表,可以在方括号中指定索引来访问数组中的各个成员,其中索引是一个整数,从0开始. 一维数组 多维数组(矩形数组) 数组的数组(锯齿数组) 数组必须在访问之前初始化,数组的初始化有两种 ...

  6. c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

    Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel ...

  7. poj 1700

    http://poj.org/problem?id=1700 题目大意就是一条船,有N个人需要过河,求N个人最短过河的时间 #include <stdio.h> int main() { ...

  8. kendoUI grid 过滤时出错:TypeError toLowerCase is not a function

    错误原因:类型不一致. 有些过滤类型为字符串,有些为整型时.

  9. centos vim配置高亮语法和格式化粘贴

    centos vim配置高亮语法和格式化粘贴 设置vim别名和高亮grep词语 echo -e "\nalias vi=vim\nalias grep='grep --color'\n&qu ...

  10. redis 异常解决办法

    redis 异常解决办法 26069:M 08 Aug 17:06:58.858 # WARNING: The TCP backlog setting of 511 cannot be enforce ...