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

news2025/1/19 17:03:08

【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的安全检查较少,因此比其他方法稍快一些,但是使用编译模型会产生更好的启动时间。

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1608146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vivado 存储器校准调试

存储器校准调试 Vivado 中的存储器接口 IP 支持校准调试。其中存储有实用的核配置、校准和数据窗口信息 &#xff0c; 可在 Vivado 硬件管理器 中访问这些信息。“存储器校准调试 (Memory Calibration Debug) ”可随时用于读取此信息 &#xff0c; 并从存储器接口 IP 中获…

TongRds docker 镜像做成与迁移(by liuhui)

TongRds docker 镜像做成与迁移 一&#xff0c;使用 docker commit 命令制作 TongRds docker 镜 像 1.1 拉取基础镜像 centos 并运行该镜像 拉取镜像&#xff1a;docker pull ubuntu 镜像列表&#xff1a;docker images 运行镜像&#xff1a;docker run -itd --name myubuntu…

做外贸企业邮箱哪个好?外贸邮箱价格怎么样?

随着全球化的深入&#xff0c;外贸公司在国际市场上的竞争日益猛烈。公司邮箱是公司和外界沟通的重要桥梁&#xff0c;其挑选与使用对外贸公司至关重要。目前市面上&#xff0c;Zoho Mail公司邮箱&#xff0c;Gmail、Outlook、阿里云公司邮箱和腾讯企业邮箱等各有特色&#xff…

欢乐钓鱼大师加速、暴击内置脚本,直接安装

无需手机root,安装软件即可使用&#xff0c;仅限安卓。 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

【技巧】PPT文件如何添加公司LOGO?

在工作上&#xff0c;我们经常要给PPT文件添加上公司的logo&#xff0c;如果一页一页添加不但耗时耗力&#xff0c;还容易有遗漏。那怎样快速给PPT添加logo呢&#xff1f;不清楚的小伙伴一起来看看如何吧&#xff01; 操作步骤&#xff1a; 1.打开PPT文件&#xff0c;点击菜单…

资产收集利器-ARL灯塔

介绍 ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统&#xff0c;旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 它拥有收集管理资产、资产监控、扫描与管理指纹、Github 关键字监控、文件泄漏等风险检测、nuclei PoC 调用等功能。 搭建 灯塔…

Vitis AI 迁移学习并部署在DPU中

目录 1. 本文目的 2. ResNet18介绍 3. 迁移学习 4. 量化配置文件 5. 模型编译&#xff1a; 6. 总结 1. 本文目的 使用迁移学习的方法&#xff0c;将预训练的resnet18模型从原来的1000类分类任务&#xff0c;改造为适应自定义的30类分类任务。 2. ResNet18介绍 ResNet1…

零基础小白如何自学网络安全(入门)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

VMware17Pro虚拟机安装macOS教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装补丁4.1 解压补丁4.2 结束VMware相关进程4.3 运行补丁包 5. 安装macOS5.1 新建虚拟机5.2 修改虚拟机配置5.3 安装操作系统5.3.1 选择 ISO 映像文件5.3.2 开启虚拟机5.2.…

CommunityToolkit.Mvvm笔记---AsyncRelayCommand

AsyncRelayCommand 是 CommunityToolkit.Mvvm 中的一个功能&#xff0c;专门设计用来处理异步操作。它是 RelayCommand 的一个变体&#xff0c;提供了对异步任务的支持&#xff0c;允许开发者在 MVVM&#xff08;Model-View-ViewModel&#xff09;模式中方便地实现异步命令。使…

前端打包webpack vite

起步 | webpack 中文文档 | webpack中文文档 | webpack中文网 npm run build 1webpack: mkdir webpack-demo cd webpack-demo npm init -y npm install webpack webpack-cli --save-dev vite : 快速上手 | Vue.js

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

llama_factory微调QWen1.5

GitHub - hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100 LLMsUnify Efficient Fine-Tuning of 100 LLMs. Contribute to hiyouga/LLaMA-Factory development by creating an account on GitHub.https://github.com/hiyouga/LLaMA-FactoryQwen1.5 介绍 | QwenGITH…

EEG基础

01 简介 脑电图(EEG)因其低成本、无创、便携以及毫秒级的高时间分辨率等特点&#xff0c;成为了研究大脑功能、异常和神经生理动力学的可靠且广泛使用的测量工具。 在神经信号处理领域&#xff0c;EEG通常作为一种非侵入性的脑成像技术用于诊断脑部疾病&#xff0c;而正常EE…

50.基于SpringBoot + Vue实现的前后端分离-酒店管理系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的酒店管理系统设计与实现管理工作系统…

VMware最新下载安装

1、打开浏览器 搜索VMware官网&#xff0c;点进去。如图&#xff1a; 这里有两种下载方法&#xff0c;便洁就是我这种&#xff0c;还有一种就是注册账号之后下载就完全没有必要了&#xff0c;而且基本注册不了&#xff0c;不太好注册。 2、选择"产品"第二个选项 …

深度剖析扫雷游戏的各个知识点(2)

小伙伴们&#xff0c;大家好。这次继续上次的剖析扫雷游戏的知识点。 那么本次咱们主要是讲扫雷中的宏定义&#xff0c;也就是#define这些 首先#define是用来定义一个宏&#xff0c;后面就是类似于和变量一样的常量名&#xff0c;以及最后的数字就是它的值。 定义规则 #def…

被Claude3的图生代码技术秀到了,前端开发效率,提升到秒级

被Claude3的图生代码技术秀到了&#xff01;前端开发效率&#xff0c;提升到秒级 上传一张网站图片&#xff0c;用Claude3 生成实现这个网站的代码的教程来啦&#xff01; 在Claude3 的中文网站上一分钟就能实现&#xff0c;生成前端代码。中文网站地址是https://askmanyai.c…

【银角大王———Django学习DAY0——基础准备】

银角大王——Django学习前情提要 &#xff08;1&#xff09;在pycharm中下载Flask&#xff08;2&#xff09;使用Flask&#xff08;3&#xff09;下载BootStrap框架&#xff08;4&#xff09; 使用BootStrap框架 &#xff08;1&#xff09;在pycharm中下载Flask 在设置——项目…