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); }
删除对象:
修改对象:
作者:【唐】三三
出处:https://www.cnblogs.com/tangge/p/4535922.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
EntityFramework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2012-05-28 GridView中如何实现导出含DropdownList、TextBox,实现分页及导出Excel数据
2012-05-28 获取DropDownList选择项的值