我正在尝试构建一个涉及WCF服务的解决方案,该服务调用包含EntityFramework6模型的dll。当我尝试对服务进行单元测试时,我会收到一条消息:
Additional information: No connection string named 'SyslogEntities' could be found in the application config file.
我的流程按逻辑排列为:
SyslogDataSvcTest.dll (app.config has service bindings) ->
SyslogDataSvc.svc (web.config has provider and connection string) ->
LibSyslogData.dll (app.config has providers and connection string)
触及EF的所有代码都在libSyslogData.dll中。它在内部将数据映射到上层对象,并返回它们,而不是暴露自己的模型信息,因此EF应该真正被隔离。
那么我做错了什么?
编辑: 我让它运作良好,但也许是一种奇怪的方式。在安装EF和MySql依赖项时,NuGet似乎没有正确指定我的app.config中的设置。
相反,我在MSDN上创建了一个in-code配置类: https://msdn.microsoft.com/en-us/data/jj680699
现在我有了这堂课:
public class EFConfiguration : DbConfiguration {
public EFConfiguration()
{
//For some reason this works much better than the app.config.
//With this defined, upper layer config documents need only specify the "SyslogEntities" Connection string.
SetExecutionStrategy("MySql.Data.MySqlClient", () => new MySqlExecutionStrategy());
SetDefaultConnectionFactory(new MySqlConnectionFactory());
SetProviderFactory("MySql.Data.MySqlClient", new MySqlClientFactory());
SetProviderServices("MySql.Data.MySqlClient", new MySqlProviderServices());
}
}
我可以将数据库实现的细节留给数据层,并且只在上层配置连接字符串。
答案 0 :(得分:2)
您很可能不会根据该异常测试实际的wcf服务(我的意思是在线)。我认为你只是对wcf服务dll代码进行单元测试。所以这意味着所使用的app.config来自单元测试程序集。只需1个app.config用于应用程序的运行时,无论如何都拥有类库的app.config也没有意义。
您需要在单元测试程序集中提供EF数据访问层正在使用的EF连接字符串,就像在wcf服务web.config中一样(因为您没有测试在线wcf服务)。如果您希望在单元测试和wcf服务配置中完全不使用EF引用,则需要覆盖EF实体的默认构造函数并提供" normal" app / web中的dbprovider + connectionstring配置并动态创建EF连接字符串。