我有以下库:
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.dll或Entity 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 类???