场景:

在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拥有组合主键LawyerIDDivisionID。

Notice that the Lawyer has a Compound key made up of both the LawyerID and DivisionID.

当你在创建包含组合式外键LawyerDivision的类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.LawyerIDteam.DivisionID呢还是仅仅清除外键team.LawyerID?

Does this mean clear team.LawyerID & team.DivisionID or just team.LawyerID?

从Relationship的角度来看,只要清除任何一个可空的外键就可以使这个Relationship被清除。

这里很难说用户倾向哪一种,与其介绍一些特殊的规定,我们还是来看看EF所使用的限制和规则,我们可以遵守:

当用户需要把一个Relationship设置成空的时候,EF将把所有可空的外键设置为空,无论该外键属性是否参与了其他Relationship。

问题:

根据上面的规则,这里EF是同时把DivisionIDLawyerID两个外键属性都置空了,因为它们都返回到了Lawyer的导航属性中。

上面的方式将同时把LawyerDivision两个对象同时置空,你真的想那样吗,或许不是。

解决办法:

如果你只是想置空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相关推荐

  1. 【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

    [EF学习笔记09]----------使用 EntityState 枚举标记实体状态,实现增删改查 讲解之前,先来看一下我们的数据库结构:班级表 学生表 如上图,实体状态由EntityState枚举 ...

  2. 【EF学习笔记07】----------加载关联表的数据 贪婪加载

    [EF学习笔记07]----------加载关联表的数据 贪婪加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entitie ...

  3. Fortran学习杂记(一)

    Fortran学习杂记(一) 1. 内置函数 1) 数值运算 常见:- abs( ) - aimag( ) -conj( ) -max( ) ** -min( ) - mod(a, b) - real ...

  4. 51单片机学习杂记——基于STC89C52RC

    51单片机学习杂记--基于STC89C52RC 我是看的b站郭天祥老师的课,说实话,我觉得我能力不是很够,所以记得很杂.废物了属于是. 接下来就是正文了 基本的元器件以及字母符号含义: 电容:帮助晶振 ...

  5. Python日常学习杂记

    Python日常学习杂记 python -c 的作用 在命令行里执行python时,如果加上 -c,即 python -c xxx 那么,xxx就被当做一条指令(command)来执行,否则,就当做脚 ...

  6. EF学习和使用(七)EF性能优化篇

    自从ITOO平台旗下的评教系统问世之后,其性能问题引起了轩然大波.CPU占用过高,页面反映速度超慢,根本无法正常使用,为此我们专门成立一个性能优化小队,去研究为什么系统性能这么低,怎么优化性能? 框架 ...

  7. 【菜鸟C++学习杂记】ASCII码转换和显示

    笔者今年刚考上华东某高校的计算机研究生,本科虽是计算机学院,但期间主攻C#和Unity游戏开发,研究生属于小跨到计算机科学与技术,目前在进行硕导给的假期期间学习C++的任务,此类杂记主要记录下编码过程 ...

  8. Linux学习笔记39——任务调度:什么是例行性工作调度、仅执行一次的工作调度、循环执行的例行性工作调度、可唤醒停机期间的工作任务

    一.什么是例行性工作调度 1,Linux 工作调度的种类: at, cron 2,CentOS Linux 系统上常见的例行性工作 二,仅执行一次的工作调度 1,atd 的启动与 at 运行的方式 a ...

  9. EF学习之路——1.EF介绍及架构搭建

    参考文档:What is Entity Framework? Entity Framework is an open-source ORM framework for .NET application ...

最新文章

  1. Java 汉子转拼音
  2. 校宝在线携手神策数据 数据赋能产品服务体验双升级
  3. Qt之布局管理——堆栈窗体
  4. 10_Eclipse中演示Git冲突的解决
  5. 用c语言设计一个任意20个数升序排列,编写一个用选择法对一维数组升序排序的函数,并在主函数中调用该排序函数,实现对任意20个整数的排序。...
  6. Hdu1166单点更新线段树
  7. 力扣904-水果成篮(C++,总结别人的思路)
  8. VSCode自定义代码片段1——vue主模板
  9. 读书笔记——《程序员的思维修炼:开发认知潜能的九堂课》
  10. config设置源 使用pip_conda和pip重新配置源
  11. 【数据预测】基于matlab双向长短时记忆(biLSTM)数据预测【含Matlab源码 1793期】
  12. 面试题之Error和Exception总结
  13. Cobalt Strike 和 MSF 免杀上线
  14. 显卡识别为Microsoft基本显示适配器,安装9700k核芯显卡HD630驱动或安装其他核显驱动
  15. 怎么样计算机械功率,电功率与机械功率的换算公式
  16. raid缓存策略设置
  17. 水果店开业怎样宣传自己的水果店,新开水果店怎么发朋友圈宣传
  18. 面试题promise原理
  19. opencv模拟景深效果
  20. jdk1.9的安装与环境配置

热门文章

  1. 更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性
  2. 云原生生态周报 Vol. 17 | Helm 3 发布首个 beta 版本
  3. 全国计算机一级考试理论部分,计算机一级考试理论试题:第七部分 单选
  4. python合并pdf 加书签_使用Python批量合并PDF文件(带书签功能)
  5. 计算机科学导论 第4版,计算机科学导论.第4版
  6. java 第9章_Java基础第9章.ppt
  7. linux哪些端口占用了,如何查看某个端口被谁占用(Linux如何查询哪些端口被占用)...
  8. centos nginx不是命令_虚拟机下Centos 8.0 安装PHP+Mysql+Nginx
  9. 【资源放送】机器学习/深度学习最全公开视频大放送!
  10. 全球及中国甲基全氟异丁醚行业竞争现状与投资战略前景研究报告2022版