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

它们之间的关系有:

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-一对一关系的更多相关文章

  1. EF——一对一、一对多、多对多关系的配置和级联删除 04(转)

    EF里一对一.一对多.多对多关系的配置和级联删除   本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...

  2. EF Core 2.1 支持数据库一对一关系

    在使用EF Core和设计数据库的时候,通常一对多.多对多关系使用得比较多,但是一对一关系使用得就比较少了.最近我发现实际上EF Core很好地支持了数据库的一对一关系. 数据库 我们先来看看SQL ...

  3. EntityFramework之一对一关系(二)

    前言 关于表关系园中文章也是数不胜收,但是个人觉得最难攻克的是一对一,对其配置并非无道理可循,只要掌握了原理方可,且听我娓娓道来! 共享主键关系 概念:就是两个表共享相同的主键值,也就是说一表的主键值 ...

  4. EF CodeFirst 关系配置

    自从开始学习asp.net mvc采用code first以来,关系配置就没有搞清楚过!(⊙﹏⊙)b 笔记之前先感谢以下文章和博主,对他们表示崇拜,由浅入深.举例恰当.拨云见日.茅塞顿开,还有什么词, ...

  5. Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

      注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...

  6. EF 一对一、一对多、多对多配置语句小记

    数据库实体间的关系无非有这么几种:一对一.一对多.多对多,这些关系在EF框架中分别有不同的创建方式: 1.在"Database First"模式中,这些关系通过SQL语句的方式建立 ...

  7. Entity Framework管理实体关系(一):管理一对一关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种 ...

  8. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  9. 9.Configure One-to-One(配置一对一关系)【Code-First系列】

    现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键[实际上是一对零或者一对一]. 请注意:一对一的关系,在MS SQL Server中,技术 ...

  10. hibernate(五) hibernate一对一关系映射详解

    序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WH 一.一对一关系的概述 一对一关系看起来简单 ...

随机推荐

  1. Unity --- 纹理压缩基本知识点

    1.Unity支持的压缩格式的分类,这里主要指Android平台和IOS平台: DXT格式 --- Nvidia Tegra(图睿)提供ETC  --- 安卓原生支持的,OPNEGL2.0都支持,ET ...

  2. win10如何一键开启关闭windows Defender(亲测有效)

    win10如何一键开启关闭windows Defender(亲测有效) 一.总结 一句话总结:各种找资料如何开启关闭都没用,直接下载软件简单方便 软件 因为我关windows defender是用的一 ...

  3. The MySQL Server

    mysqld is the MySQL server. configuring the server. The mysql server, mysqld,has many command option ...

  4. TCHART类型

    private Steema.TeeChart.Styles.Pie pieSeries1; private Steema.TeeChart.Styles.Pie pieSeries2; privat ...

  5. POJ-2955 Brackets(括号匹配问题)

    题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...

  6. ncnn框架

    1.下载和编译ncnn git clone https://github.com/Tencent/ncnn cd ncnn mkdir build && cd build cmake ...

  7. Confluence 6 应该如何在我的空间中组织内容

    页面和博客 你在 Confluence 中创建的任何内容,从会议记录到回顾和任何中间的内容,不管来源是博客和页面. 你的主页将是任何访问你网站中的用户首先看到的内容.为了让用户更加容易的找到他们需要查 ...

  8. HTML页面的三种弹框方式

    1.弹出警告框,带确定按钮:alert 2.弹出,选择框 有确认和取消按钮 confirm 3. 弹出,输入框 : prompt

  9. Lowest Common Ancestor of a Binary Search Tree(Java 递归与非递归)

    题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...

  10. climbing stairs leetcode java

    问题描述: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either ...