Entity Framework 实体间的外键关系
EF 默认是开户级联删除的,这此规则将会删除非空外键和多对多的关系,如果 在数据库上下文中的实体模型类 存在着 级联引用和多重删除路径,那么EF就抛出 级联引用和多重删除路径的异常。
Introducing FOREIGN KEY constraint 'FK_dbo.ReviewIndexSystem_dbo.Category_CategoryID' on table
'ReviewIndexSystem' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO
ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.
如果一个实体类的一个属性类的名称为ID(Id\id) 或为ClassNameID ,EF约定它就默认为是该类的主键。
如果一个实体类的一个属性名为 导航属性名+它的主键名,或简单的为 导航属性的类名的主键名,那么约定它为两实体间的外键。
如果主键、外键属性名字不满足以上规则,就可以通过 [Key]、[Foreingkey]来指定关系。
对一一对一或者一对多关系,要在依赖的实体上加上[ForeignKey]属性指明依赖,因为EF不知道哪是主要的哪是依赖的。
可能通过设置 外键值为空(string 类型外键默认为空。int等值类型的默认不为空,可以加?使之为空,比如int? PersonID 的外键)或者使用Fluent API来 关闭默认的级联删除规则。
1、可以在数据库上下文类的 覆写OnModelCreating()方法来 关闭整个全局的级联删除规则:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); //关闭一对多的级联删除。
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); //关闭多对多的级联删除。
2、可以在此方法中关闭个别实体间的级联删除规则:
//导航属性,用于FluentAPI来设置 删除EF 默认的级联删除规则。如果不配置级联删除,此模型将会导致循环或者多个删除路径。
modelBuilder.Entity<ReviewIndexItem>().HasRequired(indexItem => indexItem.Category).WithMany(cate => cate.ReviewIndexItems).WillCascadeOnDelete(false);
modelBuilder.Entity<ReviewIndexSystem>().HasRequired(indexSystem => indexSystem.Category).WithMany(cate => cate.ReviewIndexSystems).WillCascadeOnDelete(false);
modelBuilder.Entity<ReviewProject>().HasRequired(reviewProject => reviewProject.Category).WithMany(cate => cate.ReviewProjects).WillCascadeOnDelete(false);
在Code First 开发方式中,常作用数据注解和Fluent API 来配置实体间的关系。
1、如果使用[Requied]数据注解配置一个实体类的外键,则表明此类 仅指明了映射关系中对方不能为空,也包含了客户端的验证,和服务器端的验证。
public class A
{
[Required]
[Display(Name="评审项目类别")]
public string CategoryID { get; set; }
[Display(Name = "评审项目类别")]
public virtual Category Category { get; set; }
}
2、如果使用Fluent API来配置,则只添加实体间的关系,而不添加实体间的验证规则。
判断关系一方是否为0,取决于外键属性的类型,string 类型的外键默认可空,也就是说 是0或1 对*的关系,或者 01对1。
//假设我们关闭Requied 验证属性,使用FluentAPI来配置 1对多的关系。
modelBuilder.Entity<ReviewIndexUseItem>().HasRequired(useItem => useItem.ReviewIndexItem).WithMany(item => item.ReviewIndexUseItems);
modelBuilder.Entity<ReviewIndexUseItem>().HasRequired(useItem => useItem.ReviewIndexSystem).WithMany(system => system.ReviewIndexUseItems);
3、EF在调用SaveChanges()方法的时候 ,会报错误。
当EF调用 context.SaveChanges()方法的时候 ,会默认检查 所有改变实体的所有属性,一旦发现实体任何一个属性不能满足的验证规则,会抛出"一个或多个实体的验证失败请参阅“EntityValidationErrors”属性。"的异常。
第一种方式可以通过Fluent API来配置关系,而不添加验证规则,避免错误发生。
第二种方式是可以通过 在调用SaveChange()方法前临时关闭掉实体验证,验证,dbContext.Configuration.ValidateOnSaveEnabled = false; 关闭Savechanges的验证。)
所以使用[Required] 数据注解除了指定了实体间非空的关系,还带来了验证规则。容易引发saveChanges()时的验证错误。
使用[Requied] 来定义外键关系非空不是好方法,FlentAPI才是好办法。因为[Required]既指定了非空的外键关系,又添加了
模型非空的验证的规则。而后者只指定了实体间的关系。
Entity Framework 实体间的外键关系的更多相关文章
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- SQL SERVER中获取表间主外键关系
sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...
- 《Entity Framework 6 Recipes》中文翻译系列 (10) -----第二章 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-11 两实体间Is-a和Has-a关系建模 问题 你有两张有Is-a和Has-a ...
- Entity framework 7通过代码添加外键关系的方法
这几天研究Asp.net5,也试着写了一些示例代码,因为网上的资料实在是太少了,所以在此把一些问题的解决方法记录下来,以备后查. 问题: 在EF7中,假如数据库已经存在,并且两个表具有外键关系,但是实 ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- Entity Framework 实体框架的形成之旅--实体框架的开发的几个经验总结
在前阵子,我对实体框架进行了一定的研究,然后把整个学习的过程开了一个系列,以逐步深入的方式解读实体框架的相关技术,期间每每碰到一些新的问题需要潜入研究.本文继续前面的主题介绍,着重从整体性的来总结一下 ...
- Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合
在使用Entity Framework 实体框架的时候,我们大多数时候操作的都是实体模型Entity,这个和数据库操作上下文结合,可以利用LINQ等各种方便手段,实现起来非常方便,一切看起来很美好.但 ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
随机推荐
- javaScript 翻转
一个字符串转成如下形式: 一个字符串转成如下形式"olleh dlrow"; public class reverseWord { public static void main( ...
- Spring在Bean中注入集合
以下内容引用自http://wiki.jikexueyuan.com/project/spring/injecting-collection.html: 如果你想传递多个值,如Java Collect ...
- Linux C多线程编程-线程互斥
Linux下的多线程编程需要注意的是程序需要包含头文件pthread.h,在生成可执行文件的时候需要链接库libpthread.a或者libpthread.so. 线程创建函数: pthread_cr ...
- 怎样提高hbase的入库性能
hbase写数据首先先写入memstore.当memstore满64MB以后,会flush到disk上而成为storefile.当storefile数量超过3时,会启动compaction过程将它们合 ...
- 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题或禁止第一次加载
ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数: 当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...
- 微信小程序 开发环境配置
1.注册小程序 (1)微信公众平台:https://mp.weixin.qq.com/(2)立即注册 (3)流程 (4)小程序注册 (5)填写相关信息,并去邮箱激活.这样小程序的账号就注册完成了. 2 ...
- cocos2d-x 3.2 移植到android
前人栽树,后人乘凉,这句话有点过了,只是想感谢一下为了移植cocos2d-x到android的"大婶"们所做出的贡献. 首先android环境需要配置好,需要的文 ...
- MCE----Machine-check exception
http://en.wikipedia.org/wiki/Machine_Check_Exception Machine-check exception From Wikipedia, the fre ...
- 值得收藏的45个Python优质资源(附链接)
REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy 构建专业的 REST API https://www.udemy.com/rest- ...
- 浅谈 React、Flux 与 Redux
React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化利用 props 形成单向的数据流根据 state 的变化来更新 view利用虚拟 DOM 来提升渲染性能 ...