EF6'ModelConfiguration'设置但未被发现

时间:2013-11-12 12:32:50

标签: c# entity-framework

我有以下图书馆:
EntityMODEL.dll (包含POCO类)
EntityDAL.dll [引用EntityMODEL.dll]
EntitySERVICE.dll [引用EntityMODEL.dll和EntityDAL.dll]
EntityTEST.dll [使用对EntitySERVICE.dll和EntityMODEL.dll的引用进行单元测试]

EntitySERVICE.dll EntityMODEL.dll 都是外部世界需要引用的(例如来自 EntityTEST.dll ) ,意味着外界不需要引用 EntityDAL.dll 实体框架

这是来自EntityDAL.dll的DbContext ...

EntityDAL.dll |的DbContext

public class FooContext : DbContext
{
    public FooContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }

    public DbSet<Bars> Bars{ get; set; }

    // NESTED DbConfiguration
    public class ModelConfiguration : DbConfiguration
    {
        public ModelConfiguration()
        {
            this.SetHistoryContext( .... )
        }
    }
}

从EntityTEST.dll运行单元测试时,一切正常。


在我的解决方案中,我有几个“包”(都遵循相同的MODEL / DAL / SERVICE结构),每个包处理不同的相关底层实体组。

为了协调这些多个实体'包'的活动,我有一个'orchestration'(或任务)层,包含以下库:

TaskMODEL.dll [包含POCO课程]
TaskSERVICE.dll [引用TaskMODEL.dll,EntitySERVICE.dll和EntityMODEL.dll]
   - 还提供TaskMODEL.dll类和EntityMODEL.dll类之间的转换
TaskTEST.dll [引用TaskSERVICE.dll和TaskMODEL.dll]

现在,当从TaskTEST.dll运行测试时(调用TaskSERVICE.dll中的方法,转换然后调用EntitySERVICE.dll),我收到以下错误:

... threw exception:<br/>
System.InvalidOperationException: An instance of 'ModelConfiguration'
was set but this type was not discovered in the same assembly as the
'FooContext' context.  Either put the DbConfiguration type in the same
assembly as the DbContext type, use DbConfigurationTypeAttribute on the
DbContext type to specific the DbConfigurationType, or set the
DbConfiguration type in the config file.

在FooContext实例化期间发生此错误。在FooContext构造函数上放置调试断点后,我可以看到,当从第一个测试(EntityTEST)输入构造函数时,代码会立即下降到ModelConfiguration的构造函数,一切都很好。但是,当从TaskTEST启动测试时,将抛出上述错误,而不是下降到ModelConfiguration的构造函数。

正如您从上面的初始代码片段中看到的,ModelConfiguration类嵌套在FooContext下,因此它肯定在同一个程序集中。此外,从EntityTEST.dll启动测试时,相同的库表现正常。只有当有更多层并且从TaskTEST.dll启动测试时才会出现问题。由于ModelConfiguration类在同一个程序集中,我在任何项目中都没有在app.config中提到ModelConfiguration设置。

摘要

1)             EntityTEST > EntitySERVICE > EntityDAL = GOOD
2) TaskTEST > TaskSERVICE > EntitySERVICE > EntityDAL = ERROR

之前有人看过这个问题吗?

更新

如上所述,我的解决方案中有几个EntitySERVICE / EntityMODEL / EntityDAL组合。玩了一下并命名每个DAL的ModelConfiguration类以包含DLL名称(因此它们并非所有组合都称为ModelConfiguration),错误可以重写为:

... threw exception:<br/>
System.InvalidOperationException: An instance of 

    'ModelConfiguration_NOT_THE_FOO_CONFIG'

was set but this type was not discovered in the same assembly as the
'FooContext' context.  Either put the DbConfiguration type in the same
assembly as the DbContext type, use DbConfigurationTypeAttribute on the
DbContext type to specific the DbConfigurationType, or set the
DbConfiguration type in the config file.

换句话说,环境似乎已经从测试期间使用的第一个DAL dll加载了ModelConfiguration,然后期望为它使用的后续DAL dll找到相同的ModelConfiguration。

这是否意味着我们在整个解决方案中只能有一个ModelConfiguration类?

3 个答案:

答案 0 :(得分:4)

根据有关实体框架的文档,配置在应用程序级别全局定义,然后传播到每个已加载的程序集: http://go.microsoft.com/fwlink/?LinkId=260883

如果您有多个程序集在每个程序集中定义了单独的配置,那么将仅全局使用第一个加载的程序集中的配置。所有其他配置将被忽略,并替换为对第一个加载配置的全局引用。然后它传播到每个其他已加载的程序集。

如果在不同的程序集中有多个DBCotntext类,则它们不能为每个程序集定义本地配置。相反,调用应用程序应该定义自己的配置,并按如下所示为它们设置它:

  public class MyConfiguration : DbConfiguration
  {
    public ReporsitoryConfiguration()
    {
      // your code here
    }
  }

然后:

DbConfiguration.SetConfiguration(new MyConfiguration());

答案 1 :(得分:1)

我遇到了同样的问题。

似乎与此处的解释相关的答案:

http://msdn.microsoft.com/en-us/data/jj680699

在某些情况下,无法将DbConfiguration类放在与DbContext类相同的程序集中。例如,您可能在不同的程序集中有两个DbContext类。有两个选项可以处理它。

第一个选项是使用配置文件指定要使用的DbConfiguration实例。为此,请设置entityFramework部分的codeConfigurationType属性。例如:

    ...你的EF配置...... codeConfigurationType的值必须是DbConfiguration类的程序集和名称空间限定名称。

第二个选项是在您的上下文类中放置DbConfigurationTypeAttribute。例如:

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

传递给属性的值可以是DbConfiguration类型(如上所示),也可以是程序集和名称空间限定类型名称字符串。例如:

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

我仍然使用DbConfigurationTypeAttribute

获得该错误

答案 2 :(得分:0)

同一AppDomain中只能有一种DBConfiguration类型。只要仅加载一个属性,该属性就起作用。

如果您有两个具有不同配置的上下文类,则第二个始终会失败。