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

它们之间的关系有:

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);

查询结果:

最新文章

  1. ubuntu10.04编译安装LAMP
  2. JavaScript的学习--JavaScript设计模式的总结
  3. JS网页顶部弹出可关闭广告图层
  4. continue break return的区别
  5. linux下截取给定路径中的目录部分
  6. (转)MySQL优化实例
  7. banner秒杀
  8. Manipulating Data Structures
  9. Apache 多端口多站点配置实例
  10. ubuntu设置服务开机启动
  11. 8-14-Exercise
  12. 【ADO.NET】3、从TXT中导入数据到数据库
  13. C#错误异常列表
  14. jQuery的简单应用
  15. Django 1.6 基于类的通用视图
  16. texlive、
  17. phantomjs集成到scrapy中,并禁用图片,切换UA
  18. hdu5706-GirlCat
  19. java正则表达式的忽略大小写
  20. golang反射举例

热门文章

  1. Python Scrapy 爬虫框架实例(一)
  2. (转)stm32启动文件详解
  3. spring boot: 支持jsp,支持freemarker
  4. Kaggle泰坦尼克数据科学解决方案
  5. English trip M1 - AC11 I Dreamed a Dream? 我做了一个梦 Teacher:Lamb
  6. WCF开发框架形成之旅--个人图片信息的上传保存
  7. 数组方法map(映射),reduce(规约),foreach(遍历),filter(过滤)
  8. 先天性肾上腺增生症(ACH)
  9. 4月22 mysql常用函数
  10. element中使用button会刷新一遍页面