【Entity Framework】EF配置之代码配置详解

简介: 【Entity Framework】EF配置之代码配置详解

一、概述

Entity Framework可以在配置文件(app.config/web.config)中指定实体框架应用程序的配置,也可以通过代码进行指定。后者称为基于代码的配置。


本博文将介绍配置文件中的配置。配置文件优于基于代码的配置。换而言之,如果在代码和配置文件中都有配置选择,则使用配置文件中的配置。

博文讨论仅限于EF6及更高的版本,此页面中讨论的功能,API等已引入实体框架6。如果使用的是早期版本,则部分或全部信息不适用。


二、使用DbConfiguration

EF6和更高版本中基于代码的配置是通过创建System.Data.Entity.Config.DbConfiguration的子类实现的。设置DbConfiguration的子类时,需要遵循以下标准:

  • 仅为应用程序创建一个DbConfiguration类。此类指定应用域范围内的设置。
  • DbConfiguration 类放在与 DbContext 类相同的程序集中。
  • DbConfiguration 类提供一个公共无参数构造函数。
  • 通过从此构造函数内调用受保护的 DbConfiguration 方法来设置配置选项。

DbConfiguration使用实体

实例设置EF以使用SQL Azure 执行策略 - 自动重试失败的数据库操作,并对由 Code First 中的约定创建的数据库使用本地 DB。

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;

namespace MyNamespace
{
    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
            SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
        }
    }
}


三、动态使用DbConfiguration

并不是所有的配置,都会将DbConfiguation类放在与DbContext类相同的程序集中。如,不同的程序集中有两个DbContext类。有两个选项可用于处理这种情况。

3/1. 配置文件指定要使用的DbConfiguration实例

使用配置文件指定要使用的DbConfiguration实例,请设置entityFramework部分的CodeConfigurationType属性。

<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
    ...Your EF config...
</entityFramework>

codeConfigurationType的值必须是DbConfiguration类的程序集和命名空间限定名称。

3/2. 将DbConfigurationTypeAttribute放置在上下文类中

  • 传递给特性的值为DbConfiguation类型
[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext
{
}
  • 程序集和命名空间限定的类型名称字符串
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyContextContext : DbContext
{
}


四、显示设置DbConfiguration

在使用任何DbContext类型之前可能需要先进行配置。这种情况的示例包括:

  • 使用 DbModelBuilder 生成没有上下文的模型
  • 使用应用程序上下文之前,使用其他一些框架/实用程序代码,这些代码在使用该上下文的情况中利用 DbContext

在这种情况下,EF 无法自动发现配置,必须执行以下操作之一:

  • 在配置文件中设置 DbConfiguration,如上文中的移动 DbConfiguration 部分中所述
  • 在应用程序启动过程中调用静态 DbConfiguration.SetConfiguration 方法


五、重新DbConfiguration

在使用DbConfiguration时,某些情况需要重写DbConfiguration中设置的配置。这通常不由应用程序开发人员完成,而是由不能使用派生的DbConfigration类的第三方提供程序和插件来完成。


为此,EntityFramework 允许注册事件处理程序,该事件处理程序可以在锁定之前修改现有配置。 它还提供专门用于替换 EF 服务定位器返回的任何服务的 sugar 方法。 下面是它的预期使用方法:

  • 在应用启动(使用 EF 之前)时,插件或提供程序应为此事件注册事件处理程序方法。 (注意,此操作必须在应用程序使用 EF 之前进行。)
  • 事件处理程序为需要替换的每个服务调用 ReplaceService。

例如,要替换 IDbConnectionFactoryDbProviderService,需要注册类似于以下的处理程序:

DbConfiguration.Loaded += (_, a) =>
{
       a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s));
       a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s));
};

在上面的代码中,MyProviderServicesMyConnectionFactory 表示服务的实现。


五、总结

你还可以添加其他依赖关系处理程序来获得相同的效果。

请注意,你也可以通过这种方式包装 DbProviderFactory,但这样做只会影响 EF,而不会影响在 EF 之外使用 DbProviderFactory。 出于此原因,你可能会希望继续像以前一样包装 DbProviderFactory

还应记住在应用程序外部运行的服务 - 例如,从程序包管理器控制台运行迁移时。 从控制台运行迁移时,它会尝试查找 DbConfiguration。 但是,它是否将获得包装好的服务取决于它注册的事件处理程序的位置。 如果已将其注册为 DbConfiguration 的构造的一部分,则应执行代码并包装服务。 通常不会出现这种情况,这意味着工具不会获得包装好的服务。


目录
相关文章
|
计算机视觉 Python
OpenCV中图像的掩模、加法运算讲解与实战(附Python源码)
OpenCV中图像的掩模、加法运算讲解与实战(附Python源码)
1064 0
【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
1268 0
【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
447 8
|
前端开发 C# Windows
在WPF程序中实现PropertyGrid功能
【11月更文挑战第15天】PropertyGrid 是一个用户界面组件,用于直观地查看和编辑对象属性。在 WPF 中可通过组合 Expander 和 DataGrid 实现基本功能,或使用第三方库 PropertyTools 获得更强大特性,包括属性验证和类型特定编辑器。
858 3
|
C#
c#中switch case语句的用法
C#中的 `switch case`语句提供了一种简洁而高效的方式来处理多个条件分支。通过了解其基本语法、注意事项和高级用法,可以在实际开发中灵活运用 `switch case`,提高代码的可读性和维护性。希望本文能帮助你更好地理解和使用C#中的 `switch case`语句。
923 0
WK
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
505 1
|
存储 Oracle 关系型数据库
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
|
JavaScript 前端开发
Vue中传递自定义参数到后端、后端获取数据(使用Map接收参数)
这篇文章讲述了如何在Vue中通过Axios二次封装传递自定义参数到后端,并展示了后端如何使用Map接收这些参数,以及如何避免参数转换错误和统一接口设计的方法。
|
前端开发 数据可视化 项目管理
Dhtmlx Gantt教程:创建交互式甘特图的完整指南
Dhtmlx Gantt教程:创建交互式甘特图的完整指南