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. 7.Java web—tomcat9部署

    1)安装 在此之前要安装 好jdk和jre 下载绿色版 http://tomcat.apache.org/ 解压至:D:\Program Files (x86)\tomcat9 环境变更path添加两 ...

  2. 通过Python实现自动填写调查问卷

    0X00 前言 快开学了,看到空间里面各种求填写调查问卷的,我才想起来貌似我也还没做.对于这种无意义的问卷,我是不怎么感冒的,所以我打算使用”特技”来完成,也就是python,顺便重新复习一下pyth ...

  3. 怎样高速地安装Ubuntu SDK

    我在先前的文章"Ubuntu SDK 安装"中已经具体地介绍了怎样安装Ubuntu SDK.可是非常多的开发人员可能在最后安装SDK所须要的chroots时候会失败.这里面的原因是SDK在安装chro ...

  4. XSS学习分支图

    转载请注明出处:http://blog.csdn.net/cym492224103 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2 ...

  5. firebug console说明

    控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示 ...

  6. css设置图片居中、居左、居右

      CreateTime--2017年12月8日14:25:09 Author:Marydon css设置图片居中.居左.居右 图片一般默认是居左显示的,如何更改它的水平位置呢? <div st ...

  7. flex 操作xml 实现增删改查 .

    一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为“元素”    节点:把XML元素与文本结合起来统称为节点    根节点:位于整 ...

  8. glib的安装(2)

    一: glib库的路径:    http://ftp.acc.umu.se/pub/GNOME/sources/glib/2.20/ 二: 下载glib库: wget  http://ftp.acc. ...

  9. Robotium结果的收集和失败重跑

    引用自 http://www.robotium.cn/archives/author/zered 测试用例: testsuite管理测试用例 测试结果的输出与收集? InstrumentationTe ...

  10. 智能停车O2O 独角兽初现:“ETCP停车”获5000万美金A轮融资

        日前,国内第一智能停车平台"ETCP停车"宣布完毕A轮融资,由源代码资本.SIG.易车网.经纬中国和商企界知名人士联合投资超过5000万美金.同一时候获悉,ETCP作为中国 ...