博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9.Configure One-to-One(配置一对一关系)【Code-First系列】
阅读量:6933 次
发布时间:2019-06-27

本文共 3935 字,大约阅读时间需要 13 分钟。

现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键【实际上是一对零或者一对一】。

请注意:一对一的关系,在MS SQL Server中,技术上是不可能实现的,主要还是一对零或者一对一的关系。

想了解更多的实体关系,请看MSDN,这里面讲解的很详细。----->>>。

一、使用数据注解特性,来配置一对一(一对零)的关系。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EF5{   public class Student    {       public int StudentID { get; set; }       public string StudentName { get; set; }       public virtual StudentAddress StudentAddress { get; set; }    }}
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Text;namespace EF5{   public class StudentAddress    {       //ForeignKey属性里面的参数填写的是导航属性。       [Key, ForeignKey("Student")]       public int StudentID { 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; }    }}
using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EF5{   public class DbContextClass:DbContext    {       public DbContextClass() : base("ConnectionString")        {           Database.SetInitializer(new DropCreateDatabaseIfModelChanges
()); } public DbSet
Students { get; set; } public DbSet
StudentAddresses { get; set; } }}

 

得到的数据库:

请注意,在上面的代码中,Student实体中,我没有做任何事情,然后Code-First默认约定,就将StudentID作为表的主键,然后在StudentAddress实体中,我特别指定了Key和ForeignKey特性,为了标注StudentId既是主键又是外键。在ForeignKey特性中,我指定了Student实体参数,所以就构成了一对一的关系。

当然我们可以使用Fluent API来配置一对一的关系:

使用Fluent APi来配置一对一(一对零)的关系

using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EF5{   public class DbContextClass:DbContext    {       public DbContextClass() : base("ConnectionString")        {           Database.SetInitializer(new DropCreateDatabaseIfModelChanges
()); } public DbSet
Students { get; set; } public DbSet
StudentAddresses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置表的主键 modelBuilder.Entity
().HasKey(s => s.StudentID); //配置表的外键 modelBuilder.Entity
().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress); base.OnModelCreating(modelBuilder); } }}

请注意:下面的代码,写法有错误,弄反了!!!

using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EF5{   public class DbContextClass:DbContext    {       public DbContextClass() : base("ConnectionString")        {           Database.SetInitializer(new DropCreateDatabaseIfModelChanges
()); } public DbSet
Students { get; set; } public DbSet
StudentAddresses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置表的主键 modelBuilder.Entity
().HasKey(s => s.StudentID); //配置表的外键 // modelBuilder.Entity
().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress); modelBuilder.Entity
().HasOptional(s => s.Student).WithRequired(p => p.StudentAddress); base.OnModelCreating(modelBuilder); } }}

这样得到的数据库是:

 

后面的一节中将学到,怎么配置一对多的关系。

 

 

附上系列目录:

  • Configure Many-to-Many(配置多对多关系)
  • Move Configurations(数据迁移)
  • DB Initialization Strategy(数据库初始化策略)

 

转载地址:http://vvgjl.baihongyu.com/

你可能感兴趣的文章
JVM上的响应式流 — Reactor简介
查看>>
看板中的WIP限制思想
查看>>
构造函数(constructor)与原型链(prototype)关系
查看>>
The project you were looking for could not be found
查看>>
华为云携手秒拍,云+AI助力短视频加速发展
查看>>
罗辑思维在全链路压测方面的实践和工作笔记
查看>>
人工智能深度学习Caffe框架介绍,优秀的深度学习架构
查看>>
如何将qlv格式倚天屠龙记转换为MP4格式
查看>>
最全的MAC端截图工具推荐,寻找适合自己的截图工具
查看>>
使用 nginx 同域名下部署多个 vue 项目,并使用反向代理
查看>>
Python基本数据类型之元组
查看>>
LeetCode-数组-删除有序数组重复元素
查看>>
我所理解的原型&原型链
查看>>
工作三年,我要如何提升Java技术 | 粉丝提问
查看>>
JavaScript 如何使用闭包
查看>>
React 教程:快速上手指南
查看>>
6 个理由,让我不顾一切撑腰 Python!
查看>>
[ 一起学React系列 -- 11 ] React-Router4 (1)
查看>>
在Java中使用redisTemplate操作缓存
查看>>
Generator函数的语法以及异步的应用
查看>>