现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键【实际上是一对零或者一对一】。

请注意:一对一的关系,在MS SQL Server中,技术上是不可能实现的,主要还是一对零或者一对一的关系。

想了解更多的实体关系,请看MSDN,这里面讲解的很详细。----->>>Entity Relationship

一、使用数据注解特性,来配置一对一(一对零)的关系。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class Student
    {
       public int StudentID { get; set; }

       public string StudentName { get; set; }

       public virtual StudentAddress StudentAddress { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;

namespace EF5
{
   public class StudentAddress
    {
       //ForeignKey属性里面的参数填写的是导航属性。
       [Key, ForeignKey("Student")]
       public int StudentID { get; set; }

       public string Address1 { get; set; }

       public string Address2 { get; set; }
       public string City { get; set; }
       public int Zipcode { get; set; }
       public string State { get; set; }
       public string Country { get; set; }

       public virtual Student Student { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class DbContextClass:DbContext
    {
       public DbContextClass() : base("ConnectionString")
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }
       public DbSet<StudentAddress> StudentAddresses { get; set; }

    }
}

得到的数据库:

请注意,在上面的代码中,Student实体中,我没有做任何事情,然后Code-First默认约定,就将StudentID作为表的主键,然后在StudentAddress实体中,我特别指定了Key和ForeignKey特性,为了标注StudentId既是主键又是外键。在ForeignKey特性中,我指定了Student实体参数,所以就构成了一对一的关系。

当然我们可以使用Fluent API来配置一对一的关系:

使用Fluent APi来配置一对一(一对零)的关系

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class DbContextClass:DbContext
    {
       public DbContextClass() : base("ConnectionString")
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }
       public DbSet<StudentAddress> StudentAddresses { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           //配置表的主键
           modelBuilder.Entity<StudentAddress>().HasKey(s => s.StudentID);

           //配置表的外键
           modelBuilder.Entity<StudentAddress>().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress);

           base.OnModelCreating(modelBuilder);
       }

    }
}

请注意:下面的代码,写法有错误,弄反了!!!

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class DbContextClass:DbContext
    {
       public DbContextClass() : base("ConnectionString")
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }
       public DbSet<StudentAddress> StudentAddresses { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           //配置表的主键
           modelBuilder.Entity<StudentAddress>().HasKey(s => s.StudentID);

           //配置表的外键
          // modelBuilder.Entity<StudentAddress>().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress);
           modelBuilder.Entity<StudentAddress>().HasOptional(s => s.Student).WithRequired(p => p.StudentAddress);

           base.OnModelCreating(modelBuilder);
       }

    }
}

这样得到的数据库是:

后面的一节中将学到,怎么配置一对多的关系。

附上系列目录:

9.Configure One-to-One(配置一对一关系)【Code-First系列】的更多相关文章

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

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

  2. 如何使用EF优雅的配置一对一的关系

    在这两天的时间已经有两位同事问到EF(Code First)如何配置一对一的关系,这个说难也不难,说简单吧,一旦设计跑偏那么在Coding的过程中将会很痛苦. 先举个很简单的例子,两个类User和Pr ...

  3. 【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果

    背景: 现在要将接口自动化测试结果持久化,当前只是每次运行接口测试,将测试结果通过邮件发送给项目组成员.邮件内容如下: 表设计: 为了呈现这个结果:我设计了2张表run_result和run_deta ...

  4. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  5. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  6. C# 数据操作系列 - 6 EF Core 配置映射关系

    0. 前言 在<C# 数据操作系列 - 5. EF Core 入门>篇中,我们简单的通过两个类演示了一下EF增删改查等功能.细心的小伙伴可能看了生成的DDL SQL 语句,在里面发现了些端 ...

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

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

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

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

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

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

随机推荐

  1. Ubuntu安装Gnome3

    参考:How To Install GNOME In Ubuntu 14.04 . Ubuntu11.10安装GNOME3,卸载UNITY和UNITY2D操作 和How to install Gnom ...

  2. F.I.S初探(前端工程化)

    云笔记:http://note.youdao.com/share/?id=7c4a2dcf118f0ad7bb52a36aaee46a7a&type=note   一.初识FIS 在做项目中遇 ...

  3. 如何在.NET上处理二维码

    在移动设备,网站以及应用程序间传送数据,而使用二维码真是一种较快捷的方法,也避免了蓝牙配对的混乱状况.ZXing.NET是一个开源,多格式1D/2D条码图像处理库的C#实现,ZXing.NET是个相当 ...

  4. MySQL 半同步复制+MMM架构

    200 ? "200px" : this.width)!important;} --> 介绍 上篇文章介绍了MMM架构的实现方法,但是上篇文章的MMM方案的复制是异步复制,异 ...

  5. SQL Server对比两字段的相似度(函数算法)

    相似度函数 概述    比较两个字段的相似度    最近有人问到关于两个字段求相似度的函数,所以就写了一篇关于相似度的函数,分别是“简单的模糊匹配”,“顺序匹配”,“一对一位置匹配”.在平时的这种函数 ...

  6. oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)

    开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~      (当然,你也可以再改简便一点~~~) select db ...

  7. SQL Server 更改跟踪(Chang Tracking)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ...

  8. 【Win10 应用开发】人脸识别

    可能你会认为人脸识别用起来会很复杂,老周当初也这么想,但通过实际操作后,我发现非然. 经过微软封装的东西,向来都是复杂问题简单化,只要用得舒心,代码越少越好,用最少的代码做最多的事情,此为大师境界也. ...

  9. 推荐12个漂亮的 CSS3 按钮实现方案

    在过去,我们都是使用图片或者JavaScript来实现漂亮的按钮效果,随着越来越多的浏览器对CSS3的支持和完善,使用CSS3来实现美观的按钮已没有太多的障碍.今天,本文收集了12个很不错的CSS3按 ...

  10. 为什么DOM操作很慢

    转自:http://kb.cnblogs.com/page/534571/ 一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来 ...