广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Entity Framework配置关系
  • 943
分享到

Entity Framework配置关系

2024-04-02 19:04:59 943人浏览 八月长安
摘要

目录一、Has方法与With方法1、Has方法:2、With方法:二、一对一关系:1、DataAnnotations数据标注的方式2、Fluent api方式(1)1:0..1关系(

一、Has方法与With方法

如:A类必须包含B类一个不为null的实例,而B类可选择时候包含A类一个实例。

A.HasRequired(a => a.B).WithOptional(b => b.A);

1、Has方法:

  • HasOptional:前者(A)可以包含后者(B)一个实例或者为null
  • HasRequired:前者必须包含后者一个不为null的实例
  • HasMany:前者包含后者实例的集合

2、With方法:

  • WithOptional:后者(B)可以包含前者(A)一个实例或者null
  • WithRequired:后者必须包含前者一个不为null的实例
  • WithMany:后者包含前者实例的集合

二、一对一关系:

两个类中先都要配置相应的引用属性

1、DataAnnotations数据标注的方式

用到ForeignKey外键标注。

public class Person
{
    public int PersonId { get; set; }
    public int SocialSecurityNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    1668369726
    public byte[] RowVersion { get; set; }
    public PersonPhoto Photo { get; set; }
}

public class PersonPhoto
{
    [Key, ForeignKey("PhotoOf")] //注意:PersonPhoto表中的PersonId既是外键也必须是主键
    public int PersonId { get; set; }
    public byte[] Photo { get; set; }
    public string Caption { get; set; }
    public Person PhotoOf { get; set; }
}

2、Fluent API方式

(1)1:0..1关系

PersonPhoto必须属于一个Person,但是Person不一定有PersonPhoto, 此种情况下Person是一定存在的,所以它是主从关系主的一方。

modelBuilder.Entity<Person>().HasOptional(t => t.Photo).WithRequired(t => t.PhotoOf); 
modelBuilder.Entity<PersonPhoto>().HasRequired(p => p.PhotoOf).WithOptional(p => p.Photo);

(2)1:1 关系

PersonPhoto必须属于一个Person,Person也必须有PersonPhoto。

modelBuilder.Entity<Person>().HasRequired(p => p.Photo ).WithRequiredPrincipal();
modelBuilder.Entity<PersonPhoto>().HasRequired(t => t.PhotoOf).WithRequiredDependent(t => t.Photo);

此种情况下,两个都一定存在,要确定主从关系,需要使用WithRequiredPrincipal或WithRequiredDependent。

  • 如果你选择 WithOptionalPrincipal(当前实体为主体;目标实体为依赖对象)PersonPhoto表中有一个外键,指向Person表的主键。
  • 如果你选择 WithOptionalDependen t则相反(当前实体为依赖对象;目标实体为主体)则代表Person表中有一个外键,指向PersonPhoto表的主键,

Person表可以没有对应的PersonPhoto表数据,但是PersonPhoto表每一条数据都必须对应一条Person表数据。意思就是人可以没有照片,但是有的照片必须属于某个人。

三、一对多关系:

1、DataAnnotations方式

一对多关系很多情况下我们都不需要特意的去配置,通过一些引用属性、导航属性等检测到模型之间的关系,自动为我们生成外键。

public class Destination
{//景点类
    public int DestinationId { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string Description { get; set; }
    public byte[] Photo { get; set; }
    public List Lodgings { get; set; }
}

public class Lodging
{//住宿类
    public int LodgingId { get; set; }
    public string Name { get; set; }
    public string Owner { get; set; }
    public bool IsResort { get; set; }
    public decimal MilesFromNearestairport { get; set; }
    public Destination Target { get; set; }
}

Code First观察到Lodging类中有一个对Destination的引用属性,或者Destination中又有一个集合导航属性Lodgings,因此推测出Destination与Lodging的关系是一对多关系.

所以在生成的数据库中为自动为Lodging表生成外键:外键名:Target_DestinationId

2、更改外键的nullable属性和外键的名字

默认情况下,如果你的外键命名是规范的话,Code First自动会将该属性设置为外键,不再自动创建一个外键。 
规范命名是指符合:命名为如下的形式:(在这里目标类型就是Destination)

  • [目标类型的主键名]:如:DestinationId
  • [目标类型名称]+[目标类型主键名称]:如:DestinationDestinationId
  • [导航属性名称]+[目标类型主键名称]:如:TargetDestinationId

如:DestinationId属性自动作为主键。

public class Lodging
{
        public int? DestinationId { get; set; }
        public Destination Destination { get; set; }
}

当然我们也可以自己在类中增加一个外键。

1、使用Data Annotations指定外键:

注意ForeignKey位置的不同,其后带的参数也不同。

[ForeignKey("Target")]
public int TarDestinationId { get; set; }

public Destination Target { get; set; }

public int TarDestinationId { get; set; }

[ForeignKey("TarDestinationId")]
public Destination Target { get; set; }

2、用Fluent API指定外键:

如果实体类没定义AccommodationId,那么可以使用Map方法直接指定外键名:.Map(s => s.MapKey("AccommodationId")) 
(1)Lodging一定归属于一个Destination,这种关系是1:n。

modelBuilder.Entity<Destination>().HasMany(d => d.Lodgings).WithRequired(l => l.Destination).Map(l => l.MapKey("DestinationId"));
modelBuilder.Entity<Lodgings>().HasRequired(l => l.Target).WithMany(d=>d.Lodgings).HasForeignKey(l => l.TarDestinationId);

(2)Post可以单独存在,不用归属于Blog,这种关系是0..1:n。

modelBuilder.Entity<Destination>().HasMany(d => d.Lodgings).WithOptional(l => l.Destination).Map(l => l.MapKey("DestinationId")); 
modelBuilder.Entity<Lodgings>().HasOptional(l => l.Target).WithMany(d => d.Lodgings).HasForeignKey(l => l.TarDestinationId);

3、对同一实体多个引用的情况

public class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List PrimaryContactFor { get; set; }
    public List SecondaryContactFor { get; set; }
}


public class Lodging
{
    public int LodgingId { get; set; }
    public string Name { get; set; }
    public string Owner { get; set; }
    public bool IsResort { get; set; }
    public decimal MilesFromNearestAirport { get; set; }
    public Destination Target { get; set; }
    //第一联系人
    public Person PrimaryContact { get; set; }
    //第二联系人
    public Person SecondaryContact { get; set; }
}

Lodging(旅店)有两个对Person表的引用,分别是PrimaryContact与SecondaryContact, 
同时,在Person表中也有对这两个联系人的导航:PrimaryContactFor与SecondaryContactFor。

因为在这两个表之间存在多个一对多关系,所以Code First无法处理这种情况。 
为了让Code First知道它们之间的对应关系,在这里要用到逆导航属性来解决。

(1)使用Data Annotations:

//第一联系人
[InverseProperty("PrimaryContactFor")] 
public Person PrimaryContact { get; set; }
//第二联系人
[InverseProperty("SecondaryContactFor")] 
Person SecondaryContact { get; set; }

(2)或使用Fluent API:

modelBuilder.Entity<Lodging>().HasOptional(l => l.PrimaryContact).WithMany(p => p.PrimaryContactFor); 
modelBuilder.Entity<Lodging>().HasOptional(l=>l.SecondaryContact).WithMany(p=>p.SecondaryContactFor)).Map(p => p.MapKey("SecondaryPersonID "));;

在生成的数据库中为自动为Lodging表生成两个外键:PrimaryContact _PersonID 和SecondaryPersonID

4、级联删除

1、如果两个表之间存在一对多关系,Code First默认会开启两个表之间的级联删除功能 
数据库里可以可视化的设置不级联删除,Fluent API配置此外键关系时可以设置不级联删除:

this.HasMany(d => d.Lodgings).WithRequired(l => l.Destination).Map(l => l.MapKey("DestinationId")) //一对多并指定外键名
.WillCascadeOnDelete(false);   // 关闭级联删除

2、也可以在上下文的OnModelCreating方法中移除这个默认约定

modelBuilder.Conventions.Remove();

再需要开启级联删除,则可以在FluentAPI关系映射中用. WillCascadeOnDelete(true) 单独开启

四、多对多关系

如果有两个类中,各自都是导航属性指向另一个类,Code First会认为这两个类之间是多对多关系,例如:

public class Trip
{
    public int TripId { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public decimal CostUSD { get; set; }
    public byte[] RowVersion { get; set; }
    public List Activities { get; set; }
}

public class Activity
{
    public int ActivityId { get; set; }
    [Required, MaxLength(50)]
    public string Name { get; set; }
    public List Trips { get; set; }
}

Code First生成了一张中间表ActivityTrips,将另外两张表的主键都作为外键关联到了中间表上面。 
中间表中字段的命名默认为"[目标类型名称]_[目标类型键名称]".Activity_ActivityId 和Trip_TripId 
并且也作为这个新的连接表的联合主键。

指定表名

如果我们想指定中间表的名称和键名称,我们可以用Fluent API来配置。

modelBuilder.Entity<Trap>().HasMany(t => t.Activities).WithMany(a => a.Trips).Map(m =>
 {
     m.ToTable("TripActivities");
     m.MapLefTKEy("TripIdentifier");//对应Trip的主键
     m.MapRightKey("ActivityId");
 });

 //或者
 modelBuilder<Activity>.Entity().HasMany(a => a.Trips).WithMany(t => t.Activities).Map(m =>
 {
     m.ToTable("TripActivities");
     m.MapLeftKey("ActivityId");//对应Activity的主键
     m.MapRightKey("TripIdentifier");
 });

到此这篇关于Entity Framework配置关系的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Entity Framework配置关系

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

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

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

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

下载Word文档
猜你喜欢
  • Entity Framework配置关系
    目录一、Has方法与With方法1、Has方法:2、With方法:二、一对一关系:1、DataAnnotations数据标注的方式2、Fluent API方式(1)1:0..1关系(...
    99+
    2022-11-13
  • Entity Framework使用Fluent API配置案例
    一、配置主键 要显式将某个属性设置为主键,可使用 HasKey 方法。在以下示例中,使用了 HasKey 方法对 Product 类型配置 ProductId 主键。 1、新加Pro...
    99+
    2022-11-13
  • Entity Framework Core关联删除
    目录数据库关联删除行为定义实体Fluent API 配置关联实体创建表结构EF Core 关联实体删除行为总结DeleteBehavior.CascadeDeleteBehavior...
    99+
    2022-11-12
  • ADO.NET Entity Framework配置文件举例分析
    这篇文章主要讲解了“ADO.NET Entity Framework配置文件举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET Entity Framework配置文件举例...
    99+
    2023-06-17
  • Entity Framework使用Fluent API配置的方法
    本篇内容介绍了“Entity Framework使用Fluent API配置的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2023-06-29
  • Entity Framework管理一对二实体关系
    在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系。 要在数据库中配置一对多关系,我们可...
    99+
    2022-11-13
  • Entity Framework管理一对一实体关系
    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作。现在我们来看下数据库理论中的多样性关系,我们会使用Code Firs...
    99+
    2022-11-13
  • Entity Framework使用配置伙伴创建数据库
    在上一篇文章中讲了如何使用fluent API来创建数据表,不知道你有没有注意到一个问题。上面的OnModelCreating方法中,我们只配置了一个类Product,也许代码不是很...
    99+
    2022-11-13
  • Entity Framework Core种子数据Data-Seeding怎么配置
    这篇文章主要介绍“Entity Framework Core种子数据Data-Seeding怎么配置”,在日常操作中,相信很多人在Entity Framework Core种子数据Data-Seedi...
    99+
    2023-06-29
  • Entity Framework如何管理一对二实体关系
    这篇文章主要介绍Entity Framework如何管理一对二实体关系,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!要在数据库中配置一对多关系,我们可以依赖EF约定,还可以使用数据注解或Fluent API...
    99+
    2023-06-29
  • Entity Framework如何管理一对一实体关系
    这篇文章给大家分享的是有关Entity Framework如何管理一对一实体关系的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用...
    99+
    2023-06-29
  • Entity Framework Core相关包的示例分析
    这篇文章主要介绍了Entity Framework Core相关包的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、引言我们以Entity Fr...
    99+
    2023-06-29
  • 如何进行Entity Framework Core关联删除
    这篇文章将为大家详细讲解有关如何进行Entity Framework Core关联删除,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。关联删除通常是一个数据库术语,用于描述...
    99+
    2023-06-22
  • Entity Framework中怎么使用配置伙伴创建数据库
    这篇“Entity Framework中怎么使用配置伙伴创建数据库”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“E...
    99+
    2023-06-29
  • Entity Framework 4.0自关联建模的示例分析
    这篇文章主要介绍了Entity Framework 4.0自关联建模的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。针对这个表建立自关联,详细截图如下Children...
    99+
    2023-06-17
  • Entity Framework Core相关包的概念介绍与安装
    一、引言 我们以Entity Framework Core 最新版本3.1.1进行讲解,在正式的学习之前,我们第一步是要使用EF Core中的安装包,这时候需要明确的知道到底需要安装...
    99+
    2022-11-13
  • .NET Framework配置的相关步骤是怎样的
    .NET Framework配置的相关步骤是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。对于.NET Framework的强大的功能,相比大家都应该有所...
    99+
    2023-06-17
  • Ubuntu10.10怎么配置Zend Framework
    本篇内容介绍了“Ubuntu10.10怎么配置Zend Framework”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步,打开apac...
    99+
    2023-06-13
  • Spring Data JPA 注解Entity关联关系使用详解
    目录1、OneToOne关联关系1.1 解读OneToOne源码1.2 mappedBy 注意事项1.3 CascadeType 用法1.4 orphanRemoval属性用法1.5...
    99+
    2022-11-13
  • 【六祎 - Framework】2023年;Gradle全局配置;Gradle两种配置;build.gradle & build.gradle.kts配置
    build.gradle.kts repositories { maven { setUrl("https://maven.aliyun.com/nexus/content/gro...
    99+
    2023-10-27
    gradle java android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作