EF学习杂记39:如何重置Relationships
场景:
在EF4.0中引入了FK relationships的概念,所以现在可以建立这样的一种模型:
public class Division
{
public int DivisionID {get;set} // Primary Key
public string Name {get;set;}
public virtual List<Lawyer> Lawyers {get;set;}
public virtual List<Unit> Units {get;set;}
}
public class Lawyer
{
public int LawyerID {get;set;} // Primary Key
public int DivisionID {get;set;} // Primary Key + FK to Division
public string Name {get;set;}
public virtual Division Division {get;set;}
public virtual List<Unit> Units {get;set;}
}
public class ProductTeam
{
public int ProductID {get;set;} // Primary Key
public int? DivisionID {get;set;} // FK to Division & Lawyer
public int? LawyerID {get;set;} // FK to Lawyer
public string Name {get;set;}
public virtual Division Division {get;set;}
public virtual Lawyer Lawyer {get;set;}
}
注意,这里Lawyer拥有组合主键LawyerID 和DivisionID。
Notice that the Lawyer has a Compound key made up of both the LawyerID and DivisionID.
当你在创建包含组合式外键Lawyer和Division的类ProductTeam的时候,事情讲变得有趣,如果你象下面这样操作:
var team = (from t in ctx.ProductTeams
where t.Lawyer.Name == “Fred Bloggs”
select t).FirstOrDefault();
team.Lawyer = null;
ctx.SaveChanges();
这里EF的真实操作是怎样的呢?
为了清除这个Relationship,这里到底是同时清除外键team.LawyerID和team.DivisionID呢还是仅仅清除外键team.LawyerID?
Does this mean clear team.LawyerID & team.DivisionID or just team.LawyerID?
从Relationship的角度来看,只要清除任何一个可空的外键就可以使这个Relationship被清除。
这里很难说用户倾向哪一种,与其介绍一些特殊的规定,我们还是来看看EF所使用的限制和规则,我们可以遵守:
当用户需要把一个Relationship设置成空的时候,EF将把所有可空的外键设置为空,无论该外键属性是否参与了其他Relationship。
问题:
根据上面的规则,这里EF是同时把DivisionID 和LawyerID两个外键属性都置空了,因为它们都返回到了Lawyer的导航属性中。
上面的方式将同时把Lawyer和Division两个对象同时置空,你真的想那样吗,或许不是。
解决办法:
如果你只是想置空Lawyer,你有两种选择:
选择一:改变模型中外键DivisionID的可空属性,在这里EF仅可以使LawyerID可空,这样Relationshiip将可以完整保留。但这种解决方案需要改变模型,这个并不是总是可以的,如果Division确实需要可空呢?
更好的办法是直接操纵未见属性:
var team = (from t in ctx.ProductTeams
where t.Lawyer.Name == “Fred Bloggs”
select t).FirstOrDefault();
team.LawyerID = null;
ctx.SaveChanges();
这样的方式仅仅涉及到了Lawyer,不会对Division造成影响。
转载于:https://www.cnblogs.com/brusehht/archive/2010/09/01/1815077.html
EF学习杂记39:如何重置Relationships相关推荐
- 【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查
[EF学习笔记09]----------使用 EntityState 枚举标记实体状态,实现增删改查 讲解之前,先来看一下我们的数据库结构:班级表 学生表 如上图,实体状态由EntityState枚举 ...
- 【EF学习笔记07】----------加载关联表的数据 贪婪加载
[EF学习笔记07]----------加载关联表的数据 贪婪加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entitie ...
- Fortran学习杂记(一)
Fortran学习杂记(一) 1. 内置函数 1) 数值运算 常见:- abs( ) - aimag( ) -conj( ) -max( ) ** -min( ) - mod(a, b) - real ...
- 51单片机学习杂记——基于STC89C52RC
51单片机学习杂记--基于STC89C52RC 我是看的b站郭天祥老师的课,说实话,我觉得我能力不是很够,所以记得很杂.废物了属于是. 接下来就是正文了 基本的元器件以及字母符号含义: 电容:帮助晶振 ...
- Python日常学习杂记
Python日常学习杂记 python -c 的作用 在命令行里执行python时,如果加上 -c,即 python -c xxx 那么,xxx就被当做一条指令(command)来执行,否则,就当做脚 ...
- EF学习和使用(七)EF性能优化篇
自从ITOO平台旗下的评教系统问世之后,其性能问题引起了轩然大波.CPU占用过高,页面反映速度超慢,根本无法正常使用,为此我们专门成立一个性能优化小队,去研究为什么系统性能这么低,怎么优化性能? 框架 ...
- 【菜鸟C++学习杂记】ASCII码转换和显示
笔者今年刚考上华东某高校的计算机研究生,本科虽是计算机学院,但期间主攻C#和Unity游戏开发,研究生属于小跨到计算机科学与技术,目前在进行硕导给的假期期间学习C++的任务,此类杂记主要记录下编码过程 ...
- Linux学习笔记39——任务调度:什么是例行性工作调度、仅执行一次的工作调度、循环执行的例行性工作调度、可唤醒停机期间的工作任务
一.什么是例行性工作调度 1,Linux 工作调度的种类: at, cron 2,CentOS Linux 系统上常见的例行性工作 二,仅执行一次的工作调度 1,atd 的启动与 at 运行的方式 a ...
- EF学习之路——1.EF介绍及架构搭建
参考文档:What is Entity Framework? Entity Framework is an open-source ORM framework for .NET application ...
最新文章
- Java 汉子转拼音
- 校宝在线携手神策数据 数据赋能产品服务体验双升级
- Qt之布局管理——堆栈窗体
- 10_Eclipse中演示Git冲突的解决
- 用c语言设计一个任意20个数升序排列,编写一个用选择法对一维数组升序排序的函数,并在主函数中调用该排序函数,实现对任意20个整数的排序。...
- Hdu1166单点更新线段树
- 力扣904-水果成篮(C++,总结别人的思路)
- VSCode自定义代码片段1——vue主模板
- 读书笔记——《程序员的思维修炼:开发认知潜能的九堂课》
- config设置源 使用pip_conda和pip重新配置源
- 【数据预测】基于matlab双向长短时记忆(biLSTM)数据预测【含Matlab源码 1793期】
- 面试题之Error和Exception总结
- Cobalt Strike 和 MSF 免杀上线
- 显卡识别为Microsoft基本显示适配器,安装9700k核芯显卡HD630驱动或安装其他核显驱动
- 怎么样计算机械功率,电功率与机械功率的换算公式
- raid缓存策略设置
- 水果店开业怎样宣传自己的水果店,新开水果店怎么发朋友圈宣传
- 面试题promise原理
- opencv模拟景深效果
- jdk1.9的安装与环境配置
热门文章
- 更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性
- 云原生生态周报 Vol. 17 | Helm 3 发布首个 beta 版本
- 全国计算机一级考试理论部分,计算机一级考试理论试题:第七部分 单选
- python合并pdf 加书签_使用Python批量合并PDF文件(带书签功能)
- 计算机科学导论 第4版,计算机科学导论.第4版
- java 第9章_Java基础第9章.ppt
- linux哪些端口占用了,如何查看某个端口被谁占用(Linux如何查询哪些端口被占用)...
- centos nginx不是命令_虚拟机下Centos 8.0 安装PHP+Mysql+Nginx
- 【资源放送】机器学习/深度学习最全公开视频大放送!
- 全球及中国甲基全氟异丁醚行业竞争现状与投资战略前景研究报告2022版