广告
返回顶部
首页 > 资讯 > 精选 >Entity Framework如何管理一对一实体关系
  • 282
分享到

Entity Framework如何管理一对一实体关系

2023-06-29 09:06:34 282人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关Entity Framework如何管理一对一实体关系的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用

这篇文章给大家分享的是有关Entity Framework如何管理一对一实体关系的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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

  • 一对一关系: one to one

  • 一对多关系: one to many

  • 多对多关系::many to many

首先要明确关系的概念。关系就是定义两个或多个对象之间是如何关联的。它是由关系两端的多样性值识别的,比如,一对多意味着在关系的一端,只有一个实体,我们有时称为父母;在关系的另一端,可能有多个实体,有时称为孩子。EF api将那些端分别称为主体和依赖。一对多关系也叫做一或零对多(One-or-Zero-to-Many),这意味着一个孩子可能有或可能没有父母。一对一关系也稍微有些变化,就是关系的两端都是可选的。

Entity Framework如何管理一对一实体关系

一、EF里的实体关系配置

Has方法

Entity Framework如何管理一对一实体关系

With方法

Entity Framework如何管理一对一实体关系

配置实体关系:

Entity Framework如何管理一对一实体关系

一对一表关系设计:

Entity Framework如何管理一对一实体关系

一对一关系并不常用,但是偶尔也会出现。如果一个实体有一些可选的数据,那么你可以选择这种设计。

二、使用数据注解配置一对一关系

示例中Person表作为主表,IDCard表作为从表。

1、新建实体类

Person实体类结构如下:

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 配置一对一实体关系.Model{    /// <summary>    /// 主表    /// </summary>    [Table("Person")]    public class Person    {        [Key]        public int PersonId { get; set; }        public string Name { get; set; }        public int Sex { get; set; }        public int Age { get; set; }        /// <summary>        /// virtual 表示是导航属性 启用贪懒加载        /// </summary>        [ForeignKey("PersonId")]        public virtual IDCard IDCard { get; set; }    }}

IDCard实体类结构如下:

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 配置一对一实体关系.Model{    public class IDCard    {        [Key]        public int PersonId { get; set; }        public string IDCardNo { get; set; }        public DateTime Dataissue { get; set; }        public DateTime ValidTime { get; set; }        public string IssuingAuthority { get; set; }        /// <summary>        /// 导航属性        /// </summary>        public virtual Person Person { get; set; }    }}

2、创建EF数据上下文类

using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;using 配置一对一实体关系.Model;namespace 配置一对一实体关系.EF{    public class EFDbContext :DbContext    {        public EFDbContext()            : base("name=CodeFirstApplication")        {        }        public DbSet<Person> Persons { get; set; }        public DbSet<IDCard> IDCards { get; set; }    }}

3、使用数据迁移的方式创建数据库

在使用数据迁移的过程中报错:Unable to determine the principal end of an association between the types '配置一对一实体关系.Model.Person' and '配置一对一实体关系.Model.IDCard'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations。通过查找资料,解决办法如下:添加Required数据注解,修改后的Person类结构如下:

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 配置一对一实体关系.Model{    /// <summary>    /// 主表    /// </summary>    [Table("Person")]    public class Person    {        [Key]        public int PersonId { get; set; }        public string Name { get; set; }        public int Sex { get; set; }        public int Age { get; set; }        /// <summary>        /// virtual 表示是导航属性 启用贪懒加载        /// </summary>        [ForeignKey("PersonId")]        [Required]        public virtual IDCard IDCard { get; set; }    }}

4、查看生成的数据库表结构

Entity Framework如何管理一对一实体关系

通过查看数据库表结构,发现Person表和IDCards表建立了主外键关系。

总结:使用数据注解配置一对一关系的步骤:

使用数据注解Key标识主键。
2、两个实体之间的主键Key必须相同。
3、两个实体之间有相互引用的导航属性(使用virtual)。
4、在主表中设置外键关系[ForeignKey("PersonId")]。

三、使用Fluent API来配置一对一关系

1、创建A实体类结构如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 使用FluentAPI实现.Model{    public class A    {        public int AId { get; set; }        public string Name { get; set; }        public virtual B B { get; set; }    }}

2、创建B实体类结构如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 使用FluentAPI实现.Model{    public class B    {        public int AId { get; set; }        public string Name { get; set; }        public virtual A A { get; set; }    }}

3、使用Fluent API实现

using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;using 使用FluentAPI实现.Model;namespace 使用FluentAPI实现.EF{    public class EFDbContext :DbContext    {        public EFDbContext()            : base("name=CodeFirstApplication")        { }        protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            modelBuilder.Entity<IDCard>().ToTable("IDCard").HasKey(p => p.PersonId);            modelBuilder.Entity<Person>().ToTable("Person").HasKey(p => p.PersonId);            #region 1.0 默认一对一配置            //modelBuilder.Entity<Person>().HasRequired(p => p.IDCard).WithOptional();            #endregion            #region 2.0 指定谁是主体对象谁是依赖对象            // 指定当前Person对象依赖IDCard对象,外键会创建到IDCard对象中,而IDCard对象是独立存在的表,这种依赖关系配置是错误的。            //modelBuilder.Entity<Person>().HasRequired(p => p.IDCard).WithRequiredDependent(t => t.Person);            // 正确的依赖配置如下:            //modelBuilder.Entity<IDCard>().HasRequired(p => p.Person).WithRequiredDependent(t => t.IDCard);            //modelBuilder.Entity<A>().HasRequired(p => p.B).WithRequiredDependent(d=>d.A);//WithRequiredDependent A依赖对象(A依赖B,B可以对立存在,A会被建立外键)            #endregion   指定谁是主要的对象            modelBuilder.Entity<IDCard>().HasRequired(p => p.Person).WithRequiredPrincipal(t => t.IDCard);            //WithRequiredPrincipal A 主体对象,执行A对象为被继承者,也就是父级,B继承A,A独立存在            //modelBuilder.Entity<A>().HasRequired(p => p.B).WithRequiredPrincipal(d => d.A);            #region MyRegion            #endregion            base.OnModelCreating(modelBuilder);        }    }}

这里使用了HasKey方法,指定了一个表的主键,换言之,这是一个允许我们找到一个实体的独一无二的值。之前我们没有用这个方法是因为我们要么用了Key特性或者遵守了EF的默认约定(如果属性名是由类名加上"Id"后缀或者只是"Id"组成,那么EF会计算出该主键)。因为我们现在使用了PersonId作为主键,所以我们现在需要给运行时提供额外的提示,这就是HasKey派生用场的地方。最后子表中的主键会成为父表中的外键。

因为该关系是可选的,所以它也称为一或零对一(One-or-Zero-to-One)。关系的两端都是必须要存在的关系称为一对一。比如,每个人必须要有一个单独的login,这是强制性的。你也可以使用WithRequiredDepentent或者WithRequiredPrincipal方法来代替WithOptional方法。

注意:我们可以总是从该关系的主体端或者依赖端来配置关系。我们总是需要配置一对一关系的两端(即两个实体),使用Has和With方法确保一对一关系的创建。

感谢各位的阅读!关于“Entity Framework如何管理一对一实体关系”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Entity Framework如何管理一对一实体关系

本文链接: https://www.lsjlt.com/news/324033.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Entity Framework管理一对一实体关系
    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作。现在我们来看下数据库理论中的多样性关系,我们会使用Code Firs...
    99+
    2022-11-13
  • Entity Framework如何管理一对一实体关系
    这篇文章给大家分享的是有关Entity Framework如何管理一对一实体关系的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用...
    99+
    2023-06-29
  • Entity Framework管理一对二实体关系
    在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系。 要在数据库中配置一对多关系,我们可...
    99+
    2022-11-13
  • Entity Framework如何管理一对二实体关系
    这篇文章主要介绍Entity Framework如何管理一对二实体关系,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!要在数据库中配置一对多关系,我们可以依赖EF约定,还可以使用数据注解或Fluent API...
    99+
    2023-06-29
  • 工程一体化管理系统优化工程管理的关键
    随着工程行业的不断发展,工程一体化管理系统成为了提高工程效率和质量的重要工具。本文将详细介绍工程一体化管理系统的作用、优势以及如何应用,以帮助读者更好地理解并利用这一系统。 工程一体化管理系统是一种将工程设计、施工、运维等多个环节有机整合在...
    99+
    2023-12-17
    工程管理 系统优化 关键
  • MySQL如何创建多对多和一对一关系
    这篇文章主要介绍“MySQL如何创建多对多和一对一关系”,在日常操作中,相信很多人在MySQL如何创建多对多和一对一关系问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL如何创建多对多和一对一关系”的疑...
    99+
    2023-06-29
  • mybatis如何实现一对一关联映射
    小编给大家分享一下mybatis如何实现一对一关联映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在客观世界中,对象很少是孤独存在的,如班级与学生之间的关系...
    99+
    2023-05-30
    mybatis
  • ERP系统协助企业实现项目一体化管理
    现代企业随着项目管理的加速发展,更多企业关注不同项目之间、项目与子项目之间的协调计划、优先级和执行情况,并以节约成本、提高项目成功率、实施标准流程为主要目的,来应对越来越多的项目管理任务。那么如何在不同项目之间进行资源优化组合、协调控制好不...
    99+
    2023-06-05
  • 使用Mybatis 如何实现多对一或一对多的关联查询
    使用Mybatis 如何实现多对一或一对多的关联查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先  数据库量表之间字段关系(没有主外键)studentmaj...
    99+
    2023-05-31
    mybatis 一对多 多对一
  • Spring里面一对多的关系如何使用注解实现
    这篇文章主要介绍Spring里面一对多的关系如何使用注解实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring里面一对多的关系可以用@OnetoMany注解来实现然后在实际使用中,如果要对从属对象按条件排序该...
    99+
    2023-06-21
  • 如何利用PHP开发一个简单的客户关系管理系统
    随着互联网的发展和企业规模的扩大,客户关系管理系统(CRM)在企业管理中变得越来越重要。它能够帮助企业更好地管理客户信息、跟踪销售机会、提升客户满意度等。本文将介绍如何使用PHP开发一个简单的客户关系管理系统,以便帮助企业更好地管理客户关系...
    99+
    2023-10-21
    客户关系管理系统 PHP开发 简单
  • 统一用户管理系统实现企业信息化的关键
    统一用户管理系统是一种集成化、智能化的管理工具,旨在帮助企业实现用户信息的集中管理、身份认证和权限控制。通过统一用户管理系统,企业可以提高员工的工作效率,降低管理成本,同时增强企业的信息安全。1. 用户信息的集中管理传统的用户信息管理方式...
    99+
    2024-01-01
    企业信息化 系统实现 关键
  • Java中如何实现一个航空航班管理系统
    Java中如何实现一个航空航班管理系统,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Plane对象:在Plane对象里定义了飞机的编号id、航班号、目的地、起飞...
    99+
    2023-06-20
  • 一对一直播技术中延迟与卡顿的矛盾关系如何解决?
    由于直播推送端会存在于各种不同的网络环境下面:有线、无线、3G、4G、卫星信号等等,在这些网络条件下,如何做到直播流畅不卡顿,我们这个时候就需要引入可变码率和丢帧两种策略,保证推送的实时和数据的有效。之前我们介绍过直播过程卡顿时,切换码率与...
    99+
    2023-06-05
  • vue如何实现接口统一管理
    目录vue接口统一管理vue中api接口管理总结vue接口统一管理 1.在src文件夹下面新建api文件夹,新建api.js // let apiUrl = 'http://192...
    99+
    2022-11-13
  • 如何利用java实现一个客户信息管理系统
    这篇文章将为大家详细讲解有关如何利用java实现一个客户信息管理系统,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。类图:Customer类:public class Customer&...
    99+
    2023-06-14
  • 客户如何管理系统提升客户体验的关键
    随着科技的发展,企业对于客户管理的重视程度日益提高。客户管理系统(Customer Relationship Management,CRM)是企业提升客户体验的关键工具。本文将详细说明客户如何管理系统,以及如何通过这一系统提升客户体验。 客...
    99+
    2023-12-14
    客户 管理系统 关键
  • 如何使用Visual Studio 2010统一管理数据库对象
    这篇文章主要讲解了“如何使用Visual Studio 2010统一管理数据库对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Visual Studio 2010统一管理数据库对象...
    99+
    2023-06-17
  • mybatis如何使用注解实现一对多关联查询
    mybatis 注解实现一对多关联查询 @Select("select id,mockexam_section as section,id as sectionId" ...
    99+
    2022-11-12
  • 如何使用C++实现一个简单的文件管理系统?
    如何使用C++实现一个简单的文件管理系统?概述:文件管理系统是计算机中非常重要的一个功能模块,它负责对计算机中的文件进行创建、修改、删除等操作。本文将介绍如何使用C++编程语言实现一个简单的文件管理系统,通过该系统,可以实现对文件的基本管理...
    99+
    2023-11-02
    C++ 实现 文件管理系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作