我有两个使用以下 Unity 逻辑的项目:
container.RegisterType<IUnitOfWork, MyDbContext>(
new HierarchicalLifetimeManager(),
new InjectionFactory(
c => new MyDbContext(configurationService.MySqlConnectionString)
)
);
container.RegisterType<DbContext, MyDbContext>(
new HierarchicalLifetimeManager()
);
第一个项目是一个使用Unity.MVC4包的 Web 应用程序,因此有一个定制的 DependencyResolver 来完成一些工作 -这非常有效。
第二个是非 Web 应用程序,因此使用普通的Unity包实例,但在使用MyDbContext进行调用时出错。例外是
System.Data.Entity.Core.MetadataException:指定的架构无效。错误:EntityDataModel.MyProject.ssdl(2,2):错误 0152:实体框架提供程序类型 'System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer,版本 = 6.0.0.0,文化 = 中性,PublicKeyToken = b77a5c561934e089'无法加载“System.Data.SqlClient”的 ADO.NET 提供程序。确保提供程序程序集可用于正在运行的应用程序。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。
我已将两个项目设置为调用位于单独项目中的相同服务,以尝试将问题的根源与第二个项目的 Unity 逻辑隔离开来。我还应该注意我使用 Entity Framework 6 作为 ORM。
我的问题是我需要什么 Unity 代码才能使第二个项目工作,或者是否可以添加一些 app.config 条目来引用 EF 程序集?
更新: 经过一些额外的工作,我注意到如果我引用 DbContext 程序集:
- 实体框架
- EntityFramework.SqlServer
在第二个项目中,问题消失了。我想避免引用这些程序集,因为我的客户项目不应该对 ORM 有任何了解。
我也尝试过更新连接字符串,因此我手动指定了 ORM 项目的程序集(我的 EDMX 文件所在的位置),如StackOverflow 问题中所述,但这没有任何区别。
元数据=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl