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 实体间的外键关系的更多相关文章

  1. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  2. SQL SERVER中获取表间主外键关系

    sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (10) -----第二章 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-11 两实体间Is-a和Has-a关系建模 问题 你有两张有Is-a和Has-a ...

  4. Entity framework 7通过代码添加外键关系的方法

    这几天研究Asp.net5,也试着写了一些示例代码,因为网上的资料实在是太少了,所以在此把一些问题的解决方法记录下来,以备后查. 问题: 在EF7中,假如数据库已经存在,并且两个表具有外键关系,但是实 ...

  5. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  6. Entity Framework 实体框架的形成之旅--实体框架的开发的几个经验总结

    在前阵子,我对实体框架进行了一定的研究,然后把整个学习的过程开了一个系列,以逐步深入的方式解读实体框架的相关技术,期间每每碰到一些新的问题需要潜入研究.本文继续前面的主题介绍,着重从整体性的来总结一下 ...

  7. Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合

    在使用Entity Framework 实体框架的时候,我们大多数时候操作的都是实体模型Entity,这个和数据库操作上下文结合,可以利用LINQ等各种方便手段,实现起来非常方便,一切看起来很美好.但 ...

  8. Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)

    在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...

  9. Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)

    很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...

随机推荐

  1. JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)

    这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...

  2. 社会信息化环境下的IT新战略

    我们现在所处的信息化环境正在发生改变,技术已经成为影响组织的最重要的外部力量,传统的正金字塔的结构被移动互联网深深改变:员工能够更加自由的获取信息,变成更多的信息链接,这种链接不光连接人和组织,还连接 ...

  3. Go -- 实现二叉搜索树

    树: https://suanfa.herokuapp.com/3%E6%A0%91/binarytree/ 数据结构 首先我们定义需要的数据结构.注意,TreeNode的左右节点都是*TreeNod ...

  4. keras常见问题解答

    https://keras.io/zh/getting-started/faq/ https://keras.io/zh/ https://github.com/keras-team/keras/tr ...

  5. [Testing] JavaScript Mocking Fundamentals

    Ensure Functions are Called Correctly with JavaScript Mocks Often when writing JavaScript tests and ...

  6. HDU 2317 Nasty Hacks

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. Flex事件机制学习-自定义事件实现类间通信 .

    今天,学习Flex自定义事件,可以使两个类通信,定义一个Main类. public class Main extends Sprite     {            public function ...

  8. 浅谈MySQL压缩协议细节--从源码层面

    压缩协议属于mysql通讯协议的一部分,要启用压缩协议传输功能,前提条件客户端和服务端都必须要支持zlib算法,那么,现在有个问题,假如服务端已经默认开启压缩功能,那原生客户端在连接的时候要如何才可启 ...

  9. EF使用自定义字符串连接数据库

    edmx的构造函数: public TestCheckUpdatesEntities(): base(Config.DataBaseConnectionString(), "TestChec ...

  10. JRE、JDK、JVM区别和联系

    首先说Java编程语言,它是一门高级编程语言,具体由谁何时创建的,读者可以到网上查找相关资料,这里就不再赘述.那么,谈到Java就不得不谈谈JVM.JRE和JDK三者间的区别和联系. JVM:英文全称 ...