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-一对一关系的主要内容,如果未能解决你的问题,请参考以下文章