zoukankan      html  css  js  c++  java
  • 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);

    查询结果:

  • 相关阅读:
    正则表达式
    http协议组成(请求状态码)
    谈一谈你对js线程的理解
    CSS 中定位方式有几种,说明他们的意义
    手机端白屏前端优化的方法,5 种以上
    用 js 写一个获取随机颜色的程序
    如何获取本地存储信息
    cuda 版本查阅
    ubuntu16.04 ROS安转及RVIZ启动
    Tensorflow和Caffe 简介
  • 原文地址:https://www.cnblogs.com/williamwsj/p/7259962.html
Copyright © 2011-2022 走看看