C# 如何避免在多个项目中引用实体框架

C# 如何避免在多个项目中引用实体框架,c#,entity-framework,visual-studio,C#,Entity Framework,Visual Studio,我想将实体框架封装在一个项目中。该项目将单独进行数据库访问。更新时,我想将域模型映射到EF。其目的是解决方案的其他层不应了解基础架构 我的问题是,我需要在我的“调用者”项目中引用EF以使其工作 有没有办法避免这种情况 解决方案 -联合项目 -EntityFrameworkProject(来自Nuget的EF)我使用了这种方法: 我仅在控制台启动项目中引用EntityFramework.SqlServer.dll 我在另一个项目中安装实体框架 我从EF项目中的DB创建模型 我将连接字符串从EF项目

我想将实体框架封装在一个项目中。该项目将单独进行数据库访问。更新时,我想将域模型映射到EF。其目的是解决方案的其他层不应了解基础架构

我的问题是,我需要在我的“调用者”项目中引用EF以使其工作

有没有办法避免这种情况

解决方案 -联合项目 -EntityFrameworkProject(来自Nuget的EF)

我使用了这种方法:

  • 我仅在控制台启动项目中引用EntityFramework.SqlServer.dll
  • 我在另一个项目中安装实体框架
  • 我从EF项目中的DB创建模型
  • 我将连接字符串从EF项目中的app.config移动到Console项目

  • 不幸的是,由于某些奇怪的原因,这是不可能的。您还必须在客户端应用程序中包括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的引用。