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. uiimage缩放图片大小和属性UIViewContentModeScaleAspectFit

    UIImageView *tmp = [[UIImageView alloc]initWithFrame:CGRectMake(5.0f, 5.0f, 40.0f, 40.0f)];          ...

  2. android 拍照预览

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  3. Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...

  4. linux cat 文件操作

    简略版: cat主要有三大功能:1.一次显示整个文件.$ cat filename2.从键盘创建一个文件.$ cat > filename     只能创建新文件,不能编辑已有文件.3.将几个文 ...

  5. UFLDL教程(一)---稀疏自编码器

    神经网络模型 简单的神经网络 前向传播 代价函数 对于单个例子 .其代价函数为: 给定一个包括m个例子的数据集,我们能够定义总体代价函数为: 以上公式中的第一项  是一个均方差项. 第二项是一个规则化 ...

  6. 机器学习技法总结(六)Decision Tree Hypothesis

    这里先再次提出我们利用aggregation获取更好性能的Hypothesis G所涉及的方法:blending,就是在得到g_set之后进行融合:learning呢?就是在线online的获取g并融 ...

  7. C++对象模型——Default Constructor的建构操作(第二章)

    第2章    构造函数语意学 (The Semantics of Constructor) 关于C++,最常听到的一个抱怨就是,编译器背着程序猿做了太多事情.Conversion运算符就是最常被引用的 ...

  8. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第8章节--配送SP2013Apps 应用程序生命周期

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第8章节--配送SP2013Apps 应用程序生命周期         你在商店拥有一个应用程序后.跟踪不论什么人们碰到的 ...

  9. 对JS闭包的理解

    闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确 ...

  10. C++游戏系列2:角色装备武器

    很多其它见:C++游戏系列文件夹 知识点:类的组合,A类的数据成员.是B类的对象,或B类的对象.做A类的数据成员 [项目-带武器的游戏角色] 设计一个武器类,其数据成员至少要有武器名.威力,还能够加上 ...