Entity Framework想说爱你不容易,这么多的报错,这么多的限制,该如何解决?
首先看一下采用MODEL FIRST的方式设计的实体模型对象关系图:

注意:EntityOne中有导航属性:EntityTwo
在如下代码中的几种情况进行新增操作,均会报错,新增都不会成功:
static void Main(string[] args)
{
Model1Container context = new Model1Container(); //第一种情况:EntityOne有导航属性EntityTwo ,新增时必需同时指定新增的EntityTwo ,否则报错:“Model1Container.EntityOnes”中的实体参与“EntityOneEntityTwo”关系。找到 0 个相关的“EntityTwo”。应有 1 个“EntityTwo”。
var objSetOne = context.EntityOnes;
//objSetOne.MergeOption = MergeOption.NoTracking;
objSetOne.AddObject(new EntityOne() { ID = 2, P1 = "pp1", P2 = "pp2", P3 = "pp3"});
context.SaveChanges(); //第二种情况:有些时候,我们的EntityTwo可能需要先创建,但这样执行同样报错:“Model1Container.EntityTwos”中的实体参与“EntityOneEntityTwo”关系。找到 0 个相关的“EntityOne”。应有 1 个“EntityOne”。
var objSetTwo = context.EntityTwos;
//objSetTwo.MergeOption = MergeOption.NoTracking;
objSetTwo.AddObject(new EntityTwo() { ID = 2, T1 = "tt1", T2 = "tt2", T3 = "tt3" });
context.SaveChanges(); //第三种情况:有些时候,我们的EntityTwo可能已经在之前已经创建了,此处只是查询出来,用来在需要新增EntityOne时赋值给关联属性:EntityTwo,但依旧报错:“EntityOneEntityTwo”AssociationSet 中的关系处于“Deleted”状态。如果有多重性约束,则相应的“EntityOne”也必须处于“Deleted”状态。
var objSetTwo = context.EntityTwos;
var entityTwo = objSetTwo.Single(t=>t.ID==2); var objSetOne = context.EntityOnes;
//objSetOne.MergeOption = MergeOption.NoTracking;
objSetOne.AddObject(new EntityOne() { ID = 3, P1 = "pp1", P2 = "pp2", P3 = "pp3", EntityTwo = entityTwo });
context.SaveChanges(); }
只有一种情况才能正确执行新增,如下:
Model1Container context = new Model1Container();
var objSetOne = context.EntityOnes;
objSetOne.AddObject(new EntityOne() { ID = 2, P1 = "pp1", P2 = "pp2", P3 = "pp3", EntityTwo = new EntityTwo() {ID=2, T1 = "tt1", T2 = "tt2", T3 = "tt3" } });
context.SaveChanges();
说明只有同时完成新增EntityOne与关联属性EntityTwo,才能成功,但现实是这样的吗?比如:一个人先后写了几本书,那肯定是先有人这个实体,然后才会有书这个实体,每写一本书,书的作者关联属性应该是人这个实体,但按照上面的测试,新增一本书就必需新增一个人,这显然是不对的,该如何解决呢?我目前没有找到更好的解决办法,唯一的办法就是不要导航,但这又不符合面向对象原则,所以在此还请大家多多指教,谢谢!
解决方案分享:
通过网友评论指点,我将两个实体的关联关系,由原来的1:1改为1:0,这样第一种与第三种方式是没有问题的,第二种依然存在问题,因为第二种方式只创建被关联的实体EntityTwo,而EntityTwo可有一个外键字段EntityOneEntityTwo_EntityTwo_ID,若没有相应的EntityOne的ID,是无法创建成功的,也就是说第二种方式只有给定外键的值,才有可能创建成功。算是都解决了。但仍存在一个问题,正如上面我举的例子,人与书,人可以不知道会以后会写书,也就是人不用关联书,但书写出来一定是有人的,也就是书的作者一定是关联人的,人可以写多本书,多本书的作者可以都是同一个人,然而上面采用MODEL FIRST生成的实体,是不能满足人与书这种关系的,需要进行调整,调整如下图示:



这样设定好关系后,再用上面的三种方式来进行操作,都可以通过了:
// 第一种:创建单个人对象
//var objSetPerson = context.Persons;
//objSetPerson.AddObject(Person.CreatePerson(1,"梦在旅途"));
//context.SaveChanges(); //第二种:创建书,并同时指定书的作者ID
//var objSetBook = context.Books;
//objSetBook.AddObject(Book.CreateBook(1,".NET学习1.0",1));
//context.SaveChanges(); //第三种:查询到指定的人,并在创建书的同时指定人实体
var objSetPerson = context.Persons;
Person person = objSetPerson.Single(t => t.ID == 1);
var objSetBook = context.Books;
objSetBook.AddObject(new Book() { ID = 2, Name = ".NET学习2.0", AuthorInfo=person });
context.SaveChanges();
Entity Framework想说爱你不容易,这么多的报错,这么多的限制,该如何解决?的更多相关文章
- win10想说爱你不容易——安装.net3.5也是一个坑(已有完美解决方法)
最终完美解决方法:经过多次波折,终于找到无法正常安装.net3.5的原因了,是因为已删除的用户还有注册表残留导致的,而且这个问题还会影响一个win10更新的安装,导致每天更新失败,撤销更新... 详见 ...
- Entity Framework 实体框架的形成之旅--实体框架的开发的几个经验总结
在前阵子,我对实体框架进行了一定的研究,然后把整个学习的过程开了一个系列,以逐步深入的方式解读实体框架的相关技术,期间每每碰到一些新的问题需要潜入研究.本文继续前面的主题介绍,着重从整体性的来总结一下 ...
- 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现
<在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...
- Entity Framework 6 编译出错的问题(VS2012)
更新:其实这个问题是由于VS2012的EF代码生成模板是EF 5.x的,自然会与EF6 的runtime不兼容.起初我按照更新前的方式解决了,后来却发现会出现不止这一处命名空间发生改动而导致的问题. ...
- 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5 从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...
- 【步步为营 Entity Framework+Reporting service开发】-(2) Code Fir
也许有人问,为什么要用EF创建爱你数据表,code first好处是什么? 使用EF创建数据库/表,只需要设计简单的C#类,再表内容变化的时候他会自动更新数据库结构,并且保留原有数据. EF很强大,支 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)
前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...
- Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
随机推荐
- 小谈 - web模仿手机打电话与正则表达式
昨天遇到了一个很棘手的问题,就是手机端调用web端的页面,如果用编辑器插入的内容页面中有电话的的数据就要变一下格式,让手机端可以实现拨号的功能. 研究了半天就是没一点头绪,但是偶尔看到数据中每一个电话 ...
- 如何做到在虚拟数据库和真实数据库之间自由切换?【低调赠送:QQ高仿版GG 4.4 最新源码】
记得以前在公司上班时,有时候白天的活没干完,我就会把工作带回家晚上加班继续做.但是,我们开发用的数据库是部署在公司局网内部的一台服务器上的,在家里是肯定连不上这台机器的.在家里没有数据库,服务端就跑不 ...
- Java虚拟机12:Java内存模型
什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...
- Silverlight中文本框添加回车事件后,换行无法清除的解决方法
在开发Silverlight的项目中,为了更好的用户体验,我们常要给一些控件添加一些快捷键.然而,在Silverlight中当用户回车提交后,光标停留在文本框的第二行怎么也清除不掉,经过一段时间研究, ...
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...
- VC++中开发汇编语言(转)
汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...
- 用CSS实现居中的方式
直接放链接吧,最近大量时间放在看书上了,不想玩游戏,不想看电影,只想看书,早日做出自己的网站卖广告. CSS居中
- JS基础知识总结
js基础知识点总结 如何在一个网站或者一个页面,去书写你的js代码:1.js的分层(功能):jquery(tool) 组件(ui) 应用(app),mvc(backboneJs)2.js的规划() ...
- KnockoutJS 3.X API 第一章 简介
本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...
- SQL Server的Execute As与连接池结合使用的测试
简介 在SQL Server中,Execute As关键字允许当前账户在特定上下文中以另一个用户或登录名的身份执行SQL语句,比如用户张三有权限访问订单表,用户李四并没有权限访问订单表,那么给 ...