【Entity Framework】EF配置文件设置详解

简介: 【Entity Framework】EF配置文件设置详解


一、概述

EF实体框架允许在配置文件中指定多个设置。一般来说,EF遵循"约定优于配置"的原则;从EF6开始,引入代码配置,在【Entity Framework】EF配置之代码配置详解 一文详解介绍,代码配置提供了一种代码应用配置的重要的方式。仍然可以从代码应用配置,但需要使用各种 API 来配置不同的区域。 借助配置文件选项可在部署期间轻松更改这些设置,而无需更新代码。


二、实体框架配置部分

从EF4.1开始,可以使用配置文件的appSettings部分为上下文设置数据库初始值设置项。在EF 4.3中,我们引入了自定义entityFramework部分来处理新设置。实体框架仍将识别使用旧格式设置的数据库初始值设定项,但建议尽可能改用新格式。

安装 EntityFramework NuGet 包时,entityFramework 部分会自动添加到项目的配置文件中。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework"
       type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
</configuration>


三、连接字符串

连接字符串位于标准connectionStrings元素中,不需要entityFramework部分。

  • 基于 Code First 的模型使用常规 ADO.NET 连接字符串
<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>
  • 基于 EF 设计器的模型使用特殊的 EF 连接字符串
<connectionStrings>
  <add name="BlogContext"  
    connectionString=
      "metadata=
        res://*/BloggingModel.csdl|
        res://*/BloggingModel.ssdl|
        res://*/BloggingModel.msl;
      provider=System.Data.SqlClient;
      provider connection string=
        &quot;data source=(localdb)\mssqllocaldb;
        initial catalog=Blogging;
        integrated security=True;
        multipleactiveresultsets=True;&quot;"
     providerName="System.Data.EntityClient" />
</connectionStrings>
<


四、EF数据库提供程序

在 EF6 之前,数据库提供程序的特定于实体框架的部分必须作为核心 ADO.NET 提供程序的一部分包含在内。 从 EF6 开始,EF 特定部分现在单独管理和注册。

通常无需自行注册提供程序。 此操作通常会在安装时由提供程序完成。

通过在 entityFramework 部分的 providers 子部分下包含 provider 元素来注册提供程序。 提供程序条目有两个必需的属性:

  • invariantName,标识此 EF 提供程序面向的核心 ADO.NET 提供程序
  • type,是 EF 提供程序实现的程序集限定类型名称

在安装实体框架时为注册默认 SQL Server 提供程序而创建的条目,实例如下:

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

程序集限定名称是命名空间限定名称,后跟逗号,然后是类型所在的程序集。 还可以选择指定程序集版本、区域性和公钥标记。


五、EF侦听器

从EF 6.1开始,可以在配置文件中注册侦听器。通过侦听器可在EF执行某些操作时运行其他逻辑。


通过在 entityFramework 部分的 interceptors 子部分下包含 interceptor 元素来注册侦听器。 例如,以下配置注册了内置的 DatabaseLogger 侦听器,该侦听器将所有数据库操作记录到控制台。

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>


六、将数据库操作记录到文件中

如果要将日志记录添加到现有的应用程序以帮助调试问题,则通过配置文件注册侦听器特别有用。 DatabaseLogger 通过提供文件名作为构造函数参数来支持记录到文件。

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="D:\EFLog\LogOutput.log"/>
    </parameters>
  </interceptor>
</interceptors>

默认情况下,这将导致每次应用启动时日志文件都被一个新文件覆盖。 要改为附加到日志文件(如果它已经存在),请使用以下操作:

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="D:\EFLog\LogOutput.log"/>
      <parameter value="true" type="System.Boolean"/>
    </parameters>
  </interceptor>
</interceptors>


七、Code First默认连接工厂

配置部分允许指定Code First应该使用默认连接工厂来定位要用于上下文的数据库。仅当未将连接字符串添加到上下文的配置文件时,才使用默认连接工厂。

安装 EF NuGet 包时,会注册一个指向 SQL Express 或 LocalDB 的默认连接工厂,具体取决于你安装的连接工厂。

若要设置连接工厂,请在 defaultConnectionFactory 元素中指定程序集限定类型名称。

以下是设置自己的默认连接工厂的示例:

<entityFramework>
  <defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>

上面的示例要求自定义工厂具有无参数构造函数。 如果需要,可以使用 parameters 元素指定构造函数参数。

示例,包含在实体框架中的 SqlCeConnectionFactory 需要你向构造函数提供一个提供程序固定名称。 提供程序固定名称标识要使用的 SQL Compact 版本。 以下配置将导致上下文默认使用 SQL Compact 4.0 版。

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="System.Data.SqlServerCe.4.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

如果未设置默认连接工厂,Code First 将使用指向 .\SQLEXPRESS 的 SqlConnectionFactory。 SqlConnectionFactory 也有一个构造函数,允许你重写连接字符串的各个部分。 如果要使用 .\SQLEXPRESS 以外的 SQL Server 实例,可以使用此构造函数来设置服务器。

以下配置将导致 Code First 将 MyDatabaseServer 用于未设置显式连接字符串的上下文。

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>


八、数据库初始值设定项

数据库初始值设定项按上下文进行配置。 可以使用 context 元素在配置文件中设置它们。 此元素使用程序集限定名称标识要配置的上下文。默认情况下,Code First 上下文配置为使用 CreateDatabaseIfNotExists 初始值设定项。 context 元素上有一个 disableDatabaseInitialization 属性,可用于禁用数据库初始化。

以下配置禁用 MyAssembly.dll 中定义的 Blogging.BlogContext 上下文的数据库初始化。

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>

可以使用 databaseInitializer 元素设置自定义初始值设定项

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
  </context>
</contexts>

构造函数参数使用与默认连接工厂相同的语法

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
      <parameters>
        <parameter value="MyConstructorParameter" />
      </parameters>
    </databaseInitializer>
  </context>
</contexts>

可以配置实体框架中包含的泛型数据库初始值设定项之一。 type 属性将 .NET Framework 格式用于泛型类型。

如果使用的是 Code First 迁移,则可以使用 MigrateDatabaseToLatestVersion 初始值设定项将数据库配置为自动迁移。

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>
目录
相关文章
|
7月前
|
人工智能 自然语言处理 机器人
2026年阿里云无影云电脑部署Openclaw (Clawdbot) +配置百炼Coding Plan教程
在智能办公场景不断深化的当下,OpenClaw(前身为Moltbot、Clawdbot)作为一款低门槛AI自动化代理工具,凭借自然语言指令执行、多工具协同、零编程基础适配等核心优势,成为个人与轻量团队提升办公效率的利器。其区别于普通AI助手的核心价值,在于能够直接落地实操任务,无论是文件处理、任务提醒、多平台协同,还是自动化工作流搭建,都能通过简单对话指令完成,无需用户掌握专业技术技能。
1479 10
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
Transformer 时代的语言模型:大规模语言模型的发展脉络与技术演化
本文系统梳理大语言模型技术演进脉络:从Transformer与Attention机制奠基,到BERT/GPT的范式分野;从提示工程、RLHF对齐优化,到LLaMA开源引爆生态;再到LoRA微调、FlashAttention加速、RAG增强、MCP协议互联、Skills技能封装,直至Openclaw桌面级GUI智能体。覆盖模型架构、训练优化、推理加速、应用落地全链条。
Transformer 时代的语言模型:大规模语言模型的发展脉络与技术演化
|
NoSQL Linux Redis
每天百万访问也不怕,Redis帮你搞定UV统计
本文介绍了使用Redis实现高性能UV统计系统的方法。Redis凭借其内存数据库特性,支持毫秒级响应和自动去重,非常适合高并发场景下的访客统计。核心思路是利用Redis的Set数据结构作为"每日签到墙",通过记录用户访问ID实现自动去重,并设置24小时过期时间。文章提供了Python代码示例,展示如何记录用户访问和获取当日UV统计数据,还可扩展实现多页面UV统计。相比传统数据库方案,Redis方案更加轻量高效,是中小型网站实现流量统计的理想选择。
875 0
|
消息中间件 大数据 Kafka
掌握大数据时代的心跳:实时数据处理的崛起
掌握大数据时代的心跳:实时数据处理的崛起
562 4
|
存储 Windows
解决在Mac上离线存储Disney Plus等流媒体内容
本文关于Disney+ 的下载功能,首先全面了解下载限制。最后解释如何解决在Mac上离线存储Disney Plus等流媒体内容。
|
自然语言处理 算法 图形学
几分钟生成四维内容,还能控制运动效果:北大、密歇根提出DG4D
【7月更文挑战第25天】北京大学与密歇根大学合作提出DreamGaussian4D (DG4D),解决四维内容生成中的挑战,如长时间优化、运动控制及细节质量。DG4D结合几何变换与Gaussian Splatting,大幅减少优化时间至几分钟,并增强了运动的可控性与细节质量。此框架包括Image-to-4D GS模块和Video-to-Video Texture Refinement模块,分别负责高质量四维内容生成和纹理精细化。[论文](https://arxiv.org/abs/2312.17142)
479 1
|
设计模式 缓存 监控
让系统具备良好的扩展性的依据
在当今快速发展的科技时代,系统的扩展性成为了设计和开发中的一个重要考虑因素,尤其是在软件开发领域,构建具有良好扩展性的系统是至关重要的。随着用户规模的增长、数据量的增加以及业务需求的演变,系统需要具备良好的扩展性,以满足不断增长的负载和应对复杂多变的业务场景。一个具备良好扩展性的系统能够在不进行大规模重构的情况下,轻松地进行水平或垂直扩展,实现高效、无缝的功能扩展,这种系统设计的优势在于其能够快速适应变化,并保持高性能和高可用性。而且扩展性是指系统在面对需求变化时,能够以一种高效、灵活和可持续的方式进行扩展和改进,一个具备良好扩展性的系统能够降低开发成本,提高代码的可维护性,同时也能更好地满足
629 3
让系统具备良好的扩展性的依据
|
tengine 安全 应用服务中间件
修改Nginx/Tengine版本名称伪装任意WEB SERVER
修改Nginx/Tengine版本名称伪装任意WEB SERVER
612 1
|
大数据 Linux KVM
【云计算与大数据技术】虚拟化技术、开源技术Xen、KVM、OpenVZ的讲解(图文解释 超详细)
【云计算与大数据技术】虚拟化技术、开源技术Xen、KVM、OpenVZ的讲解(图文解释 超详细)
859 0