EF-一对一关系
2024-08-26 23:31:11
针对关系型数据库来说,需要明了每个对象之间的关系。
它们之间的关系有:
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 =
}; 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);
查询结果:
最新文章
- ubuntu10.04编译安装LAMP
- JavaScript的学习--JavaScript设计模式的总结
- JS网页顶部弹出可关闭广告图层
- continue break return的区别
- linux下截取给定路径中的目录部分
- (转)MySQL优化实例
- banner秒杀
- Manipulating Data Structures
- Apache 多端口多站点配置实例
- ubuntu设置服务开机启动
- 8-14-Exercise
- 【ADO.NET】3、从TXT中导入数据到数据库
- C#错误异常列表
- jQuery的简单应用
- Django 1.6 基于类的通用视图
- texlive、
- phantomjs集成到scrapy中,并禁用图片,切换UA
- hdu5706-GirlCat
- java正则表达式的忽略大小写
- golang反射举例