11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code

原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

EF 6 Code-First系列文章目录:

这里,你将学习在两个实体间,配置一对零或者一对多的关系。
我们使用Student和StudentAddress实体来配置这种关系:

1public class Student 2{ 3 public int StudentId { get; set; } 4 public string StudentName { get; set; } 5 6 public virtual StudentAddress Address { get; set; } 7} 8 9public class StudentAddress 10{ 11 public int StudentAddressId { get; set; } 12 public string Address1 { get; set; } 13 public string Address2 { get; set; } 14 public string City { get; set; } 15 public int Zipcode { get; set; } 16 public string State { get; set; } 17 public string Country { get; set; } 18 19 public virtual Student Student { get; set; } 20}

你可以看这篇文章,Entity Relationship 来理解EF怎么管理一对一、一对多、多对多关系的。

一对零或一对一的关系发生在这样的两个实体之间:当一个表的主键,是另外一个表的主键并且是外键的时候,所以我们需要配置Student实体中的StudentID属性为主键,然后StudentAddressID既是主键又是外键。

使用数据注解配置一对零或一对一关系

这里,我们将使用数据注解特性来给Student实体和StudentAddress实体,配置一对零或者一对一关系。

Student实体遵循默认的约定,它包含一个StudentId属性,所以到时候这个属性就会成为Students表的主键,Student实体我们不用作任何修改,就让它根据默认配置就行。

对于StudentAddress实体,我们需要配置StudentAddressId为主键和外键,因为StudentAddressId遵循约定,所以只用给它配置外键。

1public class Student 2{ 3 public int StudentId { get; set; } 4 public string StudentName { get; set; } 5 6 public virtual StudentAddress Address { get; set; } 7} 8 9public class StudentAddress 10{ 11 [ForeignKey("Student")] 12 public int StudentAddressId { get; set; } 13 14 public string Address1 { get; set; } 15 public string Address2 { get; set; } 16 public string City { get; set; } 17 public int Zipcode { get; set; } 18 public string State { get; set; } 19 public string Country { get; set; } 20 21 public virtual Student Student { get; set; } 22}

这样就使用数据注解配置了一对零或一对一的关系了。

请注意:Student包含StudentAddress导航属性,并且StudentAddress实体包含Student导航属性。在一对零或一对一关系中,Student可以在没有StudentAddress的情况下被保存,但是StudentAddress没有Student的情况下不能保存。EF将会抛出异常,如果你没有Student实体就保存StudentAddress实体的话。

使用Fluent API配置一对零或者一对一关系

这里我们将使用Fluent API配置一对零或者一对一关系。

1protected override void OnModelCreating(DbModelBuilder modelBuilder) 2{ 3 // Configure Student & StudentAddress entity 4 modelBuilder.Entity<Student>() 5 .HasOptional(s => s.Address) // Mark Address property optional in Student entity 6 .WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student 7}

上面的例子中,我们从Student实体开始配置,HasOptional()方法配置Student实体中的Address导航属性为可选的【保存Student实体的时候,可以没有StudentAddress实体】,然后WithRequired方法设置StudentAddress实体中的Student导航属性为必须的【保存StudentAddress实体的时候,必须要有Student】。上面的代码,同样会使StudentAddressId成为外键。

这样你就配置了一对零或者一对一的关系,这里Student可以在没有StudentAddress的情况下保存,但是StudentAddress不能在没有Student的情况下保存。EF API将会创建下面的数据库:
enter description here

使用Fluent API配置一对一的关系

我们可以使用Fluent API配置一对一的关系,这样情况下,两个实体对于彼此都是必须的,意味着:Student必须包含StudentAddress,并且StudentAddress必须包含Student。

请注意:SQL Server中,一对一的关系,在技术上是不可能的。上面的代码设置将会永远是一对零或一对一关系。EF只是对实体形成一对一的关系,并不是在数据库中是一对一关系。

1protected override void OnModelCreating(DbModelBuilder modelBuilder) 2{ 3 // Configure StudentId as FK for StudentAddress 4 modelBuilder.Entity<Student>() 5 .HasRequired(s => s.Address) 6 .WithRequiredPrincipal(ad => ad.Student); 7 8}

上面的代码中,modelBuilder.Entity<Student>().HasRequired(s => s.Address),是设置Student实体中的 StudentAddress导航类型的Address属性是必须的,.WithRequiredPrincipal(ad => ad.Student)是设置StudentAddress实体中的Student属性是必须的。

使用 EF Power Tools为上面的一对一的例子创建实体对象模型,如下:
enter description here

这一节,一对一的关系就讲解完了,下一节学习一对多的关系。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )