设置了EF6'DbConfigurationClass',但未发现此类型 - 多个DbContexts和DbConfigurations

时间:2013-12-06 18:37:17

标签: c# .net entity-framework

我有一个解决方案,我们有两个DbContexts,我们正在从EF4转移到EF6。较旧的DbContext是代码优先的,我们主要使用较新的生成的db-first,但由于外部依赖性而需要在运行中。

我的课程如下:

namespace Old.Busted.EF.DAL
{
    [DbConfigurationType(typeof(Old.Busted.EF.DAL.OldConfiguration))]
    public class OldContext : DbContext[...]

    public class OldConfiguration : DbConfiguration[...]
}

namespace New.Shiny.EF.DAL
{
    [DbConfigurationType(typeof(New.Shiny.EF.DAL.NewConfiguration))]
    public class NewContext : DbContext[...]

    public class NewConfiguration : DbConfiguration[...]
}

我得到的确切错误是

  

设置了'NewConfiguration'的实例,但这种类型不是   在与'OldContext'上下文相同的程序集中发现。或   将DbConfiguration类型放在与DbContext相同的程序集中   类型,使用DbContext类型的DbConfigurationTypeAttribute来   指定DbConfiguration类型,或设置DbConfiguration类型   配置文件。

尝试将新配置应用于旧上下文。打破代码所在的库是唯一引用旧的和新的EF DAL的库,而且只有在通过mstest在命令行上运行测试时才会抛出此异常 - 它们从内部通过了良好的运行Visual Studio。

使用.NET 4.0和Visual Studio 2010。

我尝试过的事情:

  • 将配置信息放入配置文件而不是代码(无更改)
  • 将单个DbConfiguration放入共享库中(收支平衡 更多事情)
  • 使用DbContext构造函数传入DbConnection对象而不是无参数或字符串构造函数(无更改)

2 个答案:

答案 0 :(得分:4)

最简单的解决方案似乎是转移到基于配置文件的配置,详见here

我第一次无法使用它的原因是因为我在其中一个配置文件中列出了不同版本的EF并且没有捕获它。

我确实尝试在一个公共库中使用一个DbConfiguration类,并且这次能够让它工作(没有真正的小问题,我必须在第一次做一些非常错误的事情)但我认为配置 - 基于文件的配置是更好的解决方案。

将配置信息放在配置文件中,有多新颖!

答案 1 :(得分:0)

根据Microsoft,您可以使用DbConfiguration来解决两个DbContext,如下所示:

XML:

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

代码:

[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext
{
}

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyContextContext : DbContext
{
}

https://docs.microsoft.com/en-us/ef/ef6/fundamentals/configuring/code-based

但是我没有解决多个DbConfiguration。我的解决方案是为两个DbContext共享相同的DbConfiguration

public class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        var providerInstance = SqlProviderServices.Instance;
        SqlProviderServices.TruncateDecimalsToScale = false;
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

[DbConfigurationType(typeof(DbContextConfiguration))]
public class DbContext1 : DbContext
{

}

[DbConfigurationType(typeof(DbContextConfiguration))]
public class DbContext2 : DbContext
{

}