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 =
};
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——一对一、一对多、多对多关系的配置和级联删除 04(转)
EF里一对一.一对多.多对多关系的配置和级联删除 本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...
- EF Core 2.1 支持数据库一对一关系
在使用EF Core和设计数据库的时候,通常一对多.多对多关系使用得比较多,但是一对一关系使用得就比较少了.最近我发现实际上EF Core很好地支持了数据库的一对一关系. 数据库 我们先来看看SQL ...
- EntityFramework之一对一关系(二)
前言 关于表关系园中文章也是数不胜收,但是个人觉得最难攻克的是一对一,对其配置并非无道理可循,只要掌握了原理方可,且听我娓娓道来! 共享主键关系 概念:就是两个表共享相同的主键值,也就是说一表的主键值 ...
- EF CodeFirst 关系配置
自从开始学习asp.net mvc采用code first以来,关系配置就没有搞清楚过!(⊙﹏⊙)b 笔记之前先感谢以下文章和博主,对他们表示崇拜,由浅入深.举例恰当.拨云见日.茅塞顿开,还有什么词, ...
- Entity Framework - 理清关系 - 基于外键关联的单向一对一关系
注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...
- EF 一对一、一对多、多对多配置语句小记
数据库实体间的关系无非有这么几种:一对一.一对多.多对多,这些关系在EF框架中分别有不同的创建方式: 1.在"Database First"模式中,这些关系通过SQL语句的方式建立 ...
- Entity Framework管理实体关系(一):管理一对一关系
我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种 ...
- 问题记录:EntityFramework 一对一关系映射
EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...
- 9.Configure One-to-One(配置一对一关系)【Code-First系列】
现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键[实际上是一对零或者一对一]. 请注意:一对一的关系,在MS SQL Server中,技术 ...
- hibernate(五) hibernate一对一关系映射详解
序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WH 一.一对一关系的概述 一对一关系看起来简单 ...
随机推荐
- echarts画多条一元回归线
理论上两点一线,只要两个点即可 option = { title: { text: '', left: 'center' }, tooltip: { // trigger: 'item', // fo ...
- <%@page contentType="text/html;charset=gbk"%> 与 <meta http-equiv="Content-Type" content="text/html; charset=GBK">区别
前一个是在服务端起作用,是告诉应用服务器采用何种编码输出JSP文件流, 后一个是在客户端起作用,是告诉浏览器是采用何种编码方式显示HTML页面
- Ubuntu 16.04 不能用inittab 设置 运行等级 runlevel
Ubuntu 用 systemd 了,所以就没有 runlevel 了. 对应的,是一个systemd targets. Mapping between runlevels and systemd t ...
- [Database]各数据库连接配置:Oracle:thin 数据库连接/MySQL 连接配置
MySQL: String Driver="com.mysql.jdbc.Driver"; //驱动程序 String URL="jdb ...
- 雷林鹏分享:XML 验证器
XML 验证器 使用我们的 XML 验证器来对您的 XML 文件进行语法检查. XML 错误会终止您的程序 XML 文档中的错误会终止您的 XML 应用程序. W3C 的 XML 规范声明:如果 XM ...
- Juniper基础配置
root> show configuration | display set 配置按set行显示,查看的配置为未commit的配置(commit check)root# set sys ...
- sgu 203 Hyperhuffman
题意:给出字符出现的次数,问替换成哈夫曼编码后的文本长度. 实际上观察发现就等于树的所有节点的和.用nlogn超时.用O(n),用两个队列,一个放原始数组,一个放新生成的节点. #include &l ...
- 矩阵最优路线DP
母题:矩阵中每个点有权值,每经过一个点就累加权值,求从a点到b点的最优(最大)路线. 题型1: 从左上到右下,只能向下或者向右 for 行 for 列 dp=max dp左,dp上; 扫一遍就行 有时 ...
- How-to: Use HBase Bulk Loading, and Why
How-to: Use HBase Bulk Loading, and Why http://blog.cloudera.com/blog/2013/09/how-to-use-hbase-bulk- ...
- slf4j日志用法
在pom.xml中添加日志依赖 <!--slf4j--> <dependency> <groupId>org.slf4j</groupId> <a ...