EF-一对一关系

Posted 夜月天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF-一对一关系相关的知识,希望对你有一定的参考价值。

针对关系型数据库来说,需要明了每个对象之间的关系。

它们之间的关系有:

1、一对一(1:1):一个学生只能拥有一张身份证,一张身份证只能属于一个学生;

2、一对多(1:N):一个学生可以拥有几本书,而这些书都属于该学生所有;

3、多对多(N:M):一个学生可以选择多名教师,一个教师可以选择多名学生。

 

本篇文章要浅述的是一对一的关系。

 

一、创建

让我们先来创建一个学生类和一个身份证类,如下代码:

学生类:

    public class Student {
        public Guid ID { get; set; }       
        public string Name { get; set; }        
        public Nullable<DateTime> BirthDay { get; set; }      
        public Nullable<int> Age { get; set; } 
    }

由于在实际项目中,Student类早就被创建好了。因此我们不用动该类任何代码。我们只管新建的身份证类。

身份证类:

   public class IdentificationCard {      
        public string CardID { get; set; }
        public bool IsExpire { get; set; }
        //加上virtual,首先加载CarteenCard,再次延迟加载Student
        public virtual Student Student { get; set; }
    }

在新建的身份证类中加上一个Student类型的虚属性即可。

接下来我们再创建一个身份证类的实体类型配置,该类型配置代码在创建身份证表的时候起着一个约束和约定的作用。代码如下:

using Model;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAL.Map {
    public class IdentificationCardMap:EntityTypeConfiguration<IdentificationCard> {
        public IdentificationCardMap() {
            HasKey(x=>x.CardID);
            HasRequired(x => x.Student).WithOptional();
        }
    }
}

首先我们需要指明该身份证类型映射到数据表的主键。

接着重点来了,HasRequired(x=>x.Student)这个代码说的是,在身份证表中要求Student信息是必须的,你Student表那边派一个主键过来当人质就行,不要跑哈,必须在位,我们可是经常要查岗的哟,于是身份证表中就会创建一个与Student表主键对应的外键,且该外键非空。接下来的WithOptional()意为针对Student表来说,该身份证为可选项,由于我们没有给WithOptional输入任何参数,因此在Student表中就不会生成与身份证表相关的任何字段,Student表还是原来的Student表。

创建的身份证表为:

 

 二、使用

做了上面那些工作,无非就是在使用的时候方便一些。使用代码如下:

新增:

using (DemoContext context = new DemoContext()) {
            Student stu = new Student {
                Name = "赵子成",
                BirthDay = DateTime.Parse("1990-08-01"),
                Age = 27
            };

            IdentificationCard card = new IdentificationCard {
                CardID = "52xxxxxxxxxxxxxx09",
                IsExpire = false,
                Student = stu

            };

            context.IdentificationCards.Add(card);
            context.SaveChanges();
}

新增结果:

 

查询:

                //Find方法:以主键为参数
IdentificationCard card = context.IdentificationCards.Find("52xxxxxxxxxxxxxx09"); Console.WriteLine("{0} {1} {2} {3}",card.CardID,card.IsExpire,card.Student.ID,card.Student.Name);

查询结果:

 

以上是关于EF-一对一关系的主要内容,如果未能解决你的问题,请参考以下文章

使用 EF 6.0 和代码优先的一对一 EntityTypeConfiguration

EF基础知识小记五(一对多多对多处理)

EF6基础系列(五)---EF中的实体关系

EF-一对一关系

EF Core中通过Fluent API配置一对一关系

EF Core 一对一关系交换引用问题