C# 如何避免在多个项目中引用实体框架
我想将实体框架封装在一个项目中。该项目将单独进行数据库访问。更新时,我想将域模型映射到EF。其目的是解决方案的其他层不应了解基础架构 我的问题是,我需要在我的“调用者”项目中引用EF以使其工作 有没有办法避免这种情况 解决方案 -联合项目 -EntityFrameworkProject(来自Nuget的EF)我使用了这种方法:C# 如何避免在多个项目中引用实体框架,c#,entity-framework,visual-studio,C#,Entity Framework,Visual Studio,我想将实体框架封装在一个项目中。该项目将单独进行数据库访问。更新时,我想将域模型映射到EF。其目的是解决方案的其他层不应了解基础架构 我的问题是,我需要在我的“调用者”项目中引用EF以使其工作 有没有办法避免这种情况 解决方案 -联合项目 -EntityFrameworkProject(来自Nuget的EF)我使用了这种方法: 我仅在控制台启动项目中引用EntityFramework.SqlServer.dll 我在另一个项目中安装实体框架 我从EF项目中的DB创建模型 我将连接字符串从EF项目
不幸的是,由于某些奇怪的原因,这是不可能的。您还必须在客户端应用程序中包括EF包,而不仅仅是在数据访问库中。
可以只包含上面提到的DLL redlaz,但这样做会导致版本出现很多潜在问题。
只要克服所有的不情愿,将EF包也添加到您的客户机应用程序中。使用EF6和基于代码的配置,现在这是可能的
[DbConfigurationType(typeof(MyDbContextConfiguration))]
internal class MyDbContext : DbContext
{
public DbSet<MyModel> MyModels { get; set; }
}
internal class MyDbContextConfiguration : DbConfiguration
{
public MyDbContextConfiguration()
{
SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
}
}
[DbConfigurationType(typeof(MyDbContextConfiguration))]
内部类MyDbContext:DbContext
{
公共DbSet MyModels{get;set;}
}
内部类MyDbContextConfiguration:DbConfiguration
{
公共MyDbContextConfiguration()
{
SetProviderServices(“System.Data.SqlClient”,SqlProviderServices.Instance);
}
}
如果如上所述在项目A
中配置数据库,则只有项目A
需要引用EntityFramework
,任何引用它的项目,如项目B
,都不会尝试在其自己的程序集中查找提供程序
在
项目A
中公开您的存储库,并在项目B
中添加
配置,它应该可以完美地工作。您是否尝试过使用工作单元的存储库设计模式?如果您在存储库项目中为EF生成POCO对象,您只需要对该项目进行引用,并且在“调用方项目”中不需要EF引用?创建负责数据库连接的项目并创建存储库(工作单元也是一个好主意)。使用DTO创建一些接口,其他项目不应包含对EF的引用。