7.11 数据注解特性--InverseProperty
我们已经知道了,Code--First默认的约定,如果你没有包含外键属性在父类中,那么他会为我们创建{Class Name}_{primary Key}外键。这个InverseProperty特性用在:类之间当有多重关系的时候。
看下下面的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF3 { public class Student { public int StudentId { get; set; } public string StudentName { get; set; } public Standard CurrentStandard { get; set; } public Standard PriviousStandard { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EF3 { public class Standard { public int StandardId { get; set; } public string StandardName { get; set; } public ICollection<Student> CurrentStudent { get; set; } public ICollection<Student> PreviousStudent { get; set; } } }
上面的代码中,Student实体包含两个Standard类型的导航属性,同样的Standard实体包含两个集合类型的Student导航属性,Code-First创建了4个列为他们之间的关系:
InverseProperty这个特性可以重写这个默认的约定,下面的代码中,我们可以在Standard中使用InverseProperty特性来修正这个问题。
我们先看一下错误的例子:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; namespace EF3 { public class Standard { public int StandardId { get; set; } public string StandardName { get; set; } /// <summary> /// InverseProperty,反属性特性 /// </summary> [InverseProperty("one")] public ICollection<Student> CurrentStudent { get; set; } /// <summary> /// InverseProperty,反属性特性 /// </summary> [InverseProperty("two")] public ICollection<Student> PreviousStudent { get; set; } } }
上面的反属性特性里面我随便输入不存在的字符,然后:
提示这个反属性特性作用的属性CurrnentStudent不合法,这个属性one不是合法的导航属性。
然后我们看下正确的代码:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; namespace EF3 { public class Standard { public int StandardId { get; set; } public string StandardName { get; set; } /// <summary> /// InverseProperty,反属性特性 /// </summary> [InverseProperty("CurrentStandard")] public ICollection<Student> CurrentStudent { get; set; } /// <summary> /// InverseProperty,反属性特性 /// </summary> [InverseProperty("PriviousStandard")] public ICollection<Student> PreviousStudent { get; set; } } }
这个代码里面把Student实体中的导航属性的名称放进去。就可以了。
你当然可以使用外键特性来包含外键属性,请看下面的代码:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF3 { public class Student { public int StudentId { get; set; } public string StudentName { get; set; } public int ForeignKeyCurrent { get; set; } public int ForeignKeyPrevious { get; set; } [ForeignKey("ForeignKeyCurrent")] public Standard CurrentStandard { get; set; } [ForeignKey("ForeignKeyPrevious")] public Standard PriviousStandard { get; set; } } }
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; namespace EF3 { public class Standard { public int StandardId { get; set; } public string StandardName { get; set; } /// <summary> /// InverseProperty,反属性特性 /// </summary> [InverseProperty("CurrentStandard")] public ICollection<Student> CurrentStudent { get; set; } /// <summary> /// InverseProperty,反属性特性 /// </summary> [InverseProperty("PriviousStandard")] public ICollection<Student> PreviousStudent { get; set; } } }
等等,你以为就样就可以了呢?我们运行程序看看就知道了:
果不其然又出错了,看一下具体的信息:
将 FOREIGN KEY 约束 'FK_dbo.Students_dbo.Standards_ForeignKeyPrevious' 引入表 'Students' 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
无法创建约束。请参阅前面的错误消息。
百度了一下:http://www.cnblogs.com/chear/archive/2012/11/09/2762145.html
改一下我们的上下文类的代码:
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF3 { public class DbContextClass:DbContext { public DbContextClass():base("ConStr") { } public DbSet<Student> Studnets { get; set; } public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>()); //加上这句代码,就OK了,取消级联删除。(这里其实可以两句代码,只写一句也是可以的。亲测过!!) modelBuilder.Entity<Standard>().HasMany(t => t.CurrentStudent).WithRequired(p=>p.CurrentStandard).WillCascadeOnDelete(false);
modelBuilder.Entity<Standard>().HasMany(t => t.PreviousStudents).WithRequired(p => p.PriviousStandard).WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder); } } }
然后再运行程序就可以了。
Thus, you can use InverseProperty and ForeignKey attribute for multiple relationships between the same classes.
所以,当有多重关系的时候,你可以使用InverseProperty特性和外键特性。
当我们运行的时候,保存报错,提示主外键冲突什么的,那就是主键表Standard里面没有数据,我们插入两条数据进去,就可以了。
运行之后;
7.11 数据注解特性--InverseProperty的更多相关文章
- 9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in ...
- 9.11 翻译系列:数据注解特性之--Timestamp【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/TimeStamp-dataannotations-attribute-in-code- ...
- 9.10 翻译系列:EF数据注解特性之StringLength【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/stringlength-dataannotations-attribute-in-co ...
- 9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/maxlength-minlength-dataannotations-attribut ...
- 9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】
原文链接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.a ...
- 9.2 翻译系列:数据注解特性之---Column【EF 6 Code First系列】
原文链接:http://www.entityframeworktutorial.net/code-first/column-dataannotations-attribute-in-code-firs ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
- 9.1 翻译系列:数据注解特性之----Table【EF 6 Code-First 系列】
原文地址:http://www.entityframeworktutorial.net/code-first/table-dataannotations-attribute-in-code-first ...
- 9.8 翻译系列:数据注解特性之--Required 【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/required-attribute-dataannotations-in-code-f ...
随机推荐
- web端限时活动逻辑处理总结
由于要在web端做一个限时活动的功能,功能大致为:一个小时内可以报名参加活动,然后给予报名者奖品,先到先得.用到一些处理逻辑做下总结,以前没有做过类似的东西,都是自己先体验其他网站的报名方式,然后再摸 ...
- 【五】将博客从jekyll迁移到了hexo
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdo ...
- ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)
前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程 ...
- CYQ.Data V5 分布式缓存MemCached应用开发介绍
前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...
- .NET短距离领域通信-32feet.NET
32feet.NET[http://32feet.codeplex.com/]是shared-source的项目,支持CF.net 2.0以及桌面版本.NET framework,提供短距离领域(pe ...
- 2013 duilib入门简明教程 -- 复杂控件介绍 (13)
首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图: 然后将Name属性改成其他名字, 不能是[控件名+UI+数字]这种,因为这是DuiDesigner ...
- .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
- Ubuntu14.04、win7双系统如何设置win7为默认启动项
Ubuntu14.04.win7双系统如何设置win7为默认启动项 Ubuntu14.04.win7双系统设置win7为默认启动项方法: 在启动项选择菜单处记住windows 7对应的序号. 从上至下 ...
- java基础-多线程执行
package Thanqi; public class TestApple implements Runnable{ //苹果的数量 private int count = 5; //拿苹果 //s ...
- Join 和 apply 用法
TSQL中的join语句共有五种类型,left join,right join,inner join,full join,cross join 为了描述方便,解释一个名词"保留表" ...