配置多数据库Entity Framework 6

Posted

技术标签:

【中文标题】配置多数据库Entity Framework 6【英文标题】:Configure multiple database Entity Framework 6 【发布时间】:2013-12-16 23:38:56 【问题描述】:

在我的解决方案中,我有 2 个使用 Entity Framework 6 的项目。每个项目都指向不同的数据库,都使用相同的数据提供 - SQL Server。 我的解决方案中的第三个项目需要使用这两个数据库。我的问题是如何配置这些上下文。我尝试在单独的程序集中创建一个配置类:

namespace OSAD_Base

    class EfDbConfiguration : DbConfiguration
    
        public EfDbConfiguration()
        
            SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
        
    

并在每个上下文类中引用此配置:

namespace IntegrationDb

    [DbConfigurationType("OSAD_Base.EfDbConfiguration, OSAD_Base")]
    public partial class IntegrationEntities : DbContext
    
        public IntegrationEntities(string connectionString)
            : base(connectionString)
        
        
    

初始化我的第一个时,一切正常,但是当第二个上下文初始化时(顺序无关紧要)我得到错误:

设置了“EfDbConfiguration”实例,但未在与“B1Entities”上下文相同的程序集中发现此类型。要么将 DbConfiguration 类型放在与 DbContext 类型相同的程序集中,使用 DbContext 类型上的 DbConfigurationTypeAttribute 来指定 DbConfiguration 类型,要么在配置文件中设置 DbConfiguration 类型。请参阅http://go.microsoft.com/fwlink/?LinkId=260883 了解更多信息。*

我还尝试在我的 app.config(启动项目的)中创建实体框架部分,但出现以下错误:

配置系统初始化失败

无法识别的配置节 entityFramework

如何在同一个解决方案中使用 2 个单独的 EF 项目?

【问题讨论】:

可能重复***.com/questions/1257107/… 【参考方案1】:

拥有多少 DbContext 并不重要(在实体框架 6 中)。 只需将连接字符串放在启动项目的 appConfig 或 webConfig 中即可。

那么你准备好了。

Ef 6.01 和 Sql Compact 4.0 的两个 connectionString 的 appConfig 示例

<configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="MainDb" connectionString="Data Source=|DataDirectory|\Db.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="AnotherDb" connectionString="Data Source=|DataDirectory|\AnotherDb.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

以及 DbContexts 的示例:

public class AppDb : DbContext

    public AppDb()
        : base("MainDb")
    

    


public class AnotherDb : DbContext

    public AnotherDb()
        : base("AnotherDb")
    

    

你的上下文是否在单独的项目中并不重要,只有启动项目的配置很重要。

如果您需要任何其他信息,请告诉我。

祝你好运

【讨论】:

我对连接字符串没有任何问题。这工作得很好。问题是为上下文定义提供。尝试在启动项目的 app.config 中添加实体框架会导致错误,因为那里甚至没有引用实体框架。添加以下标签:代码 请看我上面的帖子 根本不回答问题。 这个答案让我满意将回答“标题”,因此这个答案对我来说很好。 @Kugel 问题:两个不同项目中的两个数据库上下文。如何配置他们的连接?答:你有多少项目以及这些课程在哪里都没有关系。只需在启动项目的 app.config 或 web.config 中定义 2 个连接字符串,并在 db 上下文类中使用连接字符串名称。您可以为每个数据库上下文使用相同或不同的数据库,甚至可以使用不同的数据库引擎。那么,你怎么能说它“根本”没有回答这个问题呢?【参考方案2】:

EntityFramework 6 的连接字符串应该在位于(警告!)执行文件夹中的配置文件中。 例如OP在解决方案中有多个项目,所以连接字符串必须在配置文件中属于主执行项目。

现在,如果您想在代码中定义连接字符串,您可以在配置文件中制作假连接字符串,并为您的实体实例提供新的连接字符串:

DBEntities e = new DBEntities();
e.Database.Connection.ConnectionString = "Data Source=MyServ;Initial Catalog=MyDB;Persist Security Info=True;User ID=sa;Password=***;Application Name=MyApp";

【讨论】:

【参考方案3】:

这是我使用 EF6 为两个数据库所做的

Web.config

      <connectionStrings>
        <add name="EntityContainer" connectionString="metadata=res://WebService/Database.Database.csdl|res://WebService/Database.Database.ssdl|res://WebService/Database.Database.msl; .../>
        <add name="ArchiveEntityContainer" connectionString="metadata=res://WebService/Database.Database.csdl|res://WebService/Database.Database.ssdl|res://WebService/Database.Database.msl; .../>
      </connectionStrings>

在 Database.Context.tt 中添加第二个构造函数(注意:自动生成的代码)

public <#=code.Escape(container)#>(string connectionString)
    : base(connectionString)


使用

using (EntityContainer context = new EntityContainer())

    //...


using (EntityContainer context = new EntityContainer("ArchiveEntityContainer"))

    //...

【讨论】:

这将在 EF 模板重新运行时中断。有关执行此操作的更强大的方法,请参阅this blog post by Olivier Hélin

以上是关于配置多数据库Entity Framework 6的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

《Entity Framework 6 Recipes》翻译系列 -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模 (转)

Entity Framework 6 Recipes 2nd Edition(10-9)译 -> 在多对多关系中为插入和删除使用存储过程

《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集 (转)