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

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

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

public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; } public virtual StudentAddress Address { get; set; }
} public class StudentAddress
{
public int StudentAddressId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; } public virtual Student Student { get; set; }
}

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

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

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

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

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

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

public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; } public virtual StudentAddress Address { get; set; }
} public class StudentAddress
{
[ForeignKey("Student")]
public int StudentAddressId { get; set; } public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; } public virtual Student Student { get; set; }
}

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

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

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

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

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

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

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

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

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure StudentId as FK for StudentAddress
modelBuilder.Entity<Student>()
.HasRequired(s => s.Address)
.WithRequiredPrincipal(ad => ad.Student); }

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

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

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

11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】的更多相关文章

  1. 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...

  2. 12.翻译系列:EF 6 中配置一对多的关系【EF 6 Code-First系列】

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

  3. 20.2.翻译系列:EF 6中基于代码的数据库迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx EF 6 ...

  4. log4net保存到数据库系列一:WebConfig中配置log4net

    园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志 一.WebConfig中配置log4net 二.独立配置文件中配置log4net ...

  5. ABP架构学习系列二:ABP中配置的注册和初始化

    一.手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp.Abp.Web.Abp.Web.Mvc.Abp.Web.Api 使用nuget添加Newtonsoft.Json.Castle.Cor ...

  6. (DT系列六)devicetree中数据和 struct device有什么关系

    devicetree中数据和structdevice有什么关系 总体来说,devicetree与structdevice的关系应该还是在其生成platformdevice的时候,一直传递的struct ...

  7. 【转】(DT系列六)devicetree中数据和 struct device有什么关系

    原文网址:http://www.cnblogs.com/biglucky/p/4057499.html devicetree中数据和structdevice有什么关系 总体来说,devicetree与 ...

  8. 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...

  9. 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...

随机推荐

  1. Vue Loader

    介绍 允许为 Vue 组件的每个部分使用其它的 webpack loader,例如在 <style> 的部分使用 Sass 和在 <template> 的部分使用 Pug(模板 ...

  2. LevelDB源码分析-sstable的Block

    sstable中的Block(table/block.h table/block.cc table/block_builder.h table/block_builder.cc) sstable中的b ...

  3. 给tomcat配置外部资源路径(应用场景:web项目访问图片视频等资源)

    对于一个web项目来说,除了文字之外,图片,视频等媒体元素也是其重要的组成部分.我们知道,web项目中如果用到大量的图片.视屏的资源,我们 通常的做法是只在数据库中存储图片.视频等资源的路径,web项 ...

  4. Spring再接触 注入类型

    共有三种注入类型 一种是set注入 一种是构造注入 一种是接口注入 最常用的还是set 现在看一下construct 构造注入 在userservice中加入 package com.bjsxt.se ...

  5. js程序的调试方法

  6. PXC 搭建高可用集群

    (1).PXC集群注意事项 1.PXC集群只支持innodb引擎 2.

  7. php 二维数组按照某个键排序

    $date = array_column($arr, 'run_date'); //上面得到的结果:array(0=>'2017-11-21',1=>'2017-11-20',3=> ...

  8. react-native 新手爬坑经历(Could not connect to development server.)

    来,先说下报错出现场景,刚跑完项目加载完是好的,但是双击R后就开始耍小脾气了-红屏出现,如下图 首先检查包服务器是否运行正常.在项目文件夹下输入react-native start或者npm star ...

  9. DJango 基础(6)

    Django模型基础 知识点: 数据库的配置 使用django中的模型 将模型映射到数据库 数据的增删改查基本操作 数据库的配置 1.在settings.py中配置DATABASES: DATABAS ...

  10. Python+Selenium学习--cookie处理

    场景 有时候我们需要验证浏览器中是否存在某个cookie,因为基于真实的cookie 的测试是无法通过白盒和集成测试完成的.webdriver 可以读取.添加和删除cookie 信息.webdrive ...