配置多个数据库实体框架6

时间:2013-12-01 03:24:49

标签: c# entity-framework dbcontext entity-framework-6

在我的解决方案中,我有两个使用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部分,但是出现了以下错误:

  

配置系统无法初始化

     

无法识别的配置部分entityFramework

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

3 个答案:

答案 0 :(得分:25)

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

然后你准备好了。

appConfig的示例,其中两个connectionString与Ef 6.01& Sql Compact 4.0

<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")
    {

    }
}

您的上下文是否在分离的项目中并不重要,只有启动项目的配置很重要。

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

祝你好运

答案 1 :(得分:10)

EntityFramework 6的连接字符串应该位于执行文件夹中的(alert!)内部配置文件中。 例如,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";

答案 2 :(得分:0)

这是我使用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"))
{
    //...
}