8

我有以下库:
EntityMODEL.dll (包含 POCO 类)
EntityDAL.dll [引用 EntityMODEL.dll]
EntitySERVICE.dll [引用 EntityMODEL.dll 和 EntityDAL.dll]
EntityTEST.dll [引用 EntitySERVICE.dll 的单元测试和实体模型.dll]

EntitySERVICE.dll和EntityMODEL.dll都是需要被外界引用的(例如来自EntityTEST.dll ,这意味着外界不需要引用EntityDAL.dllEntity Framework

这是我的 EntityDAL.dll 中的 DbContext ...

EntityDAL.dll | 数据库上下文

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 结构),每个包都处理不同的相关基础实体组。

为了协调这些多个实体“包”之间的活动,我有一个“编排”(或任务)层,其中包含以下库:

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 类???

4

3 回答 3

4

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

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

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

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

接着:

DbConfiguration.SetConfiguration(new MyConfiguration());
于 2017-01-11T16:46:07.177 回答
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 收到该错误

于 2013-12-01T01:29:45.477 回答
0

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

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

于 2019-08-22T16:12:54.023 回答