【Entity Framework】闲话EF中批量配置

2024-04-20 02:44

本文主要是介绍【Entity Framework】闲话EF中批量配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Entity Framework】闲话EF中批量配置

文章目录

  • 【Entity Framework】闲话EF中批量配置
    • 一、概述
    • 二、OnModelCreating中的批量配置
      • 元数据API的缺点
    • 三、预先约定配置
      • 忽略类型
      • 默认类型映射
      • 预先约定配置的限制
      • 约定
      • 添加新约定
      • 替换现有约定
      • 约定实现注意事项
    • 四、何时使用每种方法进行批量配置
      • 在以下情况下使用`元数据API`:
      • 在以下情况下使用预先预定模型配置:
      • 在以下情况下使用最终约定:
      • 在以下情况下使用交互式约定:

在这里插入图片描述

一、概述

当需要在多个实体类型中以相同方式配置一个方面时,可以通过以下方式减少代码重复并合并逻辑。

二、OnModelCreating中的批量配置

ModelBuilder返回的每个生成器对象都会公开一个ModelMetadata属性,该属性提供对构成模型的对象的低级别访问。具体而言,有些方法允许循环访问模型中的特定对象,并对其应用通用配置。

如下示例中,模型中包含一个自定义值类型Currency:

public readonly struct Current
{public Crrent(decimal amount)=>Amount = amount;public decimal Amount{get;}public override string ToString() => $"${Amount}";
}

默认情况下不会发现此类型的属性,因为当前EF提供程序不知道如何将其映射到数据库类型。此OnModelCreating代码片段添加类型Currency的所有属性。并将值类型器配置为受支持的类型-decimal

foreach(var entityType in modelBuilder.Model.GetEntityTypes())
{foreach (var propertyInfo in entityType.ClrType.GetProperties()){if (propertyInfo.PropertyType == typeof(Currency)){entityType.AddProperty(propertyInfo).SetValueConverter(typeof(CurrencyConverter));}}
}
public class CurrencyConverter : ValueConverter<Currency, decimal>
{public CurrencyConverter(): base(v => v.Amount,v => new Currency(v)){}
}

元数据API的缺点

  • Fluent API不同,对模型的每次修改都需要显示完成。
  • 每次更改后都会运行约定。如果删除约定发现的导航,则约定将再次运行,并可以将导航添加回来。为了防止这种情况发生,需要延迟约定,直到通过调用DelayConventions() 添加属性之后再释放返回的对象,或者使用AddIgnored 将CLR属性标记为忽略。
  • 发生此循环访问后,可能会添加实体类型,并且不会向其应用配置。通常可以通过将此代码放在OnModelCreating的末尾来防止这种情况,但如果有两组相互依赖的配置,则可能没有一个顺序可以一致地应用这些配置。

三、预先约定配置

EF Core允许为给定CLR类型指定一次映射配置;然后,此配置将应用于模型中发现的给定类型的所有属性。这称为"预先预定模型配置",因为它配置模型的各个方面,直到允许运行模型生成约定。此类配置通过在DbContext派生的类型上替代ConfigureConventions来应用。

以下示例演示如何将类型Currency的所有属性配置为具有值转换器:

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder){configurationBuilder.Properties<Currency>().HaveConversion<CurrencyConverter>();
}

以下示例演示如何在类型 string 的所有属性上配置一些方面:

configurationBuilder.Properties<string>().AreUnicode(false).HaveMaxLength(1024);

备注

ConfigureConventions调用中指定的类型可以是基类型,接口或泛型类型定义。所有匹配的配置将从最不具体的配置开始按顺序应用:

  1. 接口
  2. 基类型
  3. 泛型类型定义
  4. 不可以为null的值类型
  5. 确切类型

预先约定配置相当于将匹配对象添加到模型后立即应用的显示配置。它将替代所有约定和数据注释。

忽略类型

预先预定配置还允许忽略某个类型,并防止约定将其作为实体类型或实体类型的属性发现:

configurationBuilder.IgnoreAny(typeof(IList<>));

默认类型映射

通常,只要为此类型的属性指定了值转换器,EF就可以使用提供程序不支持的类型常量转换查询。但是,在不涉及此类型的任何属性的查询中,EF无法找到正确的值转换器。在这种情况下。可以调用DefaultTypeMapping 添加或替代提供程序类型映射:

configurationBuilder.DefaultTypeMapping<Currency>().HasConversion<CurrencyConverter>();

预先约定配置的限制

  • 许多方面无法使用此方法进行配置
  • 目前,配置仅由CLR类型确定
  • 在创建模型之前,将执行此配置。如果应用此配置时出现任何冲突,则异常堆栈跟踪将不包含ConfigureConventions方法,因此可能更难找到原因。

约定

EF Core模型生成约定是根据在生成模型时对模型的更改触发的包含逻辑的类。这使得模型在进行显示配置,应用映射属性以及运行其他约定时保持最新状态。为了参与此过程,每个约定实现一个或多个接口,用于确定何时触发相应的方法。

模型生成约定是控制模型配置的强大方法,但可能很复杂且难以处理得当。 在许多情况下,可以使用现有的预先约定模型配置来轻松指定属性和类型的常见配置。

添加新约定

每个层次结构一个表继承映射策略需要一个鉴别器列来指定任何定行中表示的类型。默认情况下,EF对鉴别器使用未绑定的字符串列,这可确保它使用于任何鉴别器长度。但是,限制鉴别器字符串的最大长度可能会提高存储和查询的效率。

EF Core模型生成约定是根据在生成模型时对模型的更改触发,这使得模型在进行显示配置,应用映射属性以及运行其他约定时保持最新状态,为了参与此过程,每个约定实现一个或多个接口,用于确定何时触发约定。如,每次向模型添加新实体类型时,都会触发实现IEntityTypeAddedConvention的约定。同样,每当将键或外键添加到模型时,都会触发实现IForeignKeyAddedConventionIKeyAddedConvention的约定。

替换现有约定

有时,我们不想完全删除现有约定,而是想将其替换为一种操作基本相同但行为已更改的约定。这很有用,因为现有约定已经实现了需要适当触发的接口。

约定实现注意事项

EF Core会跟踪每个配置是如何进行的。这由ConfigurationSource枚举表示。不同类型的配置包含:

  • Explicit:模型元素在OnModelCreating中显示配置
  • DataAnnotation:模型元素是使用CLR类型的映射属性(既数据注释)配置的
  • Convention:模型元素是由模型生成约定配置的

预定永远不会替代标记为DataAnnotationExplicit的配置。这是通过使用"约定生成器"来实现的。例如,从Builder属性获取的IConventionPropertyBuilder

property.Builder.HasMaxLength(512);

如果 HasMaxLength 尚未由映射属性配置或在 OnModelCreating 中配置,则在约定生成器上调用它只会设置最大长度。

此类生成器方法还有第二个参数:fromDataAnnotation。 如果约定代表映射属性进行配置,则将其设置为 true

四、何时使用每种方法进行批量配置

在以下情况下使用元数据API

  • 配置需要在某个时间应用,而无需对模型中的后续更改做出反应。
  • 模型生成速度非常重要。元数据API的安全检查较少,因此比其他方法稍快一些,但是使用编译模型会产生更好的启动时间。

在以下情况下使用预先预定模型配置:

  • 适用条件很简单,因为它仅取决于类型。
  • 需要在模型中添加给定类型的属性并替代数据注释和约定时,随时应用配置。

在以下情况下使用最终约定:

  • 适用条件很复杂。
  • 配置不应替代数据注释指定的内容。

在以下情况下使用交互式约定:

  • 多个约定相互依赖。 最终约定按照添加顺序运行,因此无法对后面的最终约定所做的更改做出反应。
  • 逻辑在多个上下文之间共享。 交互式约定比其他方法更安全。

这篇关于【Entity Framework】闲话EF中批量配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919102

相关文章

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨