Entity framework 我们应该向所有层添加实体框架dll吗

Entity framework 我们应该向所有层添加实体框架dll吗,entity-framework,ef-code-first,entity-framework-6,Entity Framework,Ef Code First,Entity Framework 6,我正在使用EF代码编写一个测试应用程序。我在不同的层之间分发了代码。我原以为我只需要将entity framework包安装到数据访问层,但最终我将该包(添加DLL)安装到所有层,即UI、BLL、Models和DAL。这没关系,还是我做错了什么。下面是示例代码,让您了解我正在尝试做什么 模型层 此图层在所有其他图层/项目中都是参考图层 namespace Model { Public class Sample { [ForeignKey("Sample2Id")]

我正在使用EF代码编写一个测试应用程序。我在不同的层之间分发了代码。我原以为我只需要将entity framework包安装到数据访问层,但最终我将该包(添加DLL)安装到所有层,即UI、BLL、Models和DAL。这没关系,还是我做错了什么。下面是示例代码,让您了解我正在尝试做什么

模型层

此图层在所有其他图层/项目中都是参考图层

namespace Model
{
   Public class Sample
   {
      [ForeignKey("Sample2Id")]
      ...

   }
} 
在这一层中,由于像
[ForeignKey..

DAL

namespace DAL
{
   public class SampleContext:DbContext
   {
      ...
   }
}
namespace BLL
{
   public class SampleBLL
   {
       public List<Sample> GetAll()
       {
          retrn new SampleContext().Samples().ToList()
       }
   }
}
在DAL中,我只有上下文类和迁移

BLL

namespace DAL
{
   public class SampleContext:DbContext
   {
      ...
   }
}
namespace BLL
{
   public class SampleBLL
   {
       public List<Sample> GetAll()
       {
          retrn new SampleContext().Samples().ToList()
       }
   }
}
名称空间BLL
{
公共类样本
{
公共列表GetAll()
{
重新生成新的SampleContext().Samples().ToList()
}
}
}
如果我为BLL卸载EF,我会得到以下错误 类型System.Data.Entity.DbContext是在未引用的程序集中定义的

UI

namespace UI
{
   public class UIHelper
   {
      public List<Sample> GetSamples()
      {
         return new SampleBLL().GetAll();
      }

   }
}
命名空间用户界面
{
公共类UIHelper
{
公共列表GetSamples()
{
返回新的SampleBLL().GetAll();
}
}
}
如果我从UI卸载EF包,我会得到以下错误

实体框架提供程序类型 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer已在应用程序配置文件中注册 对于具有固定名称“System.Data.SqlClient”的ADO.NET提供程序 无法加载。请确保程序集限定名为 已使用,并且程序集对正在运行的应用程序可用


我创建了一个示例项目,它与您当前的设置非常相似,没有模型层/DAL分离

我有三个项目,DAL(其中包含对
EntityFramework.dll
EntityFramework.SqlServer.dll
)的引用,BLL只调用DAL中的一个方法,UI只调用BLL方法

我必须将
DAL
app.config
部分添加到UI的

当我第一次运行代码时,我遇到了与您遇到的相同的错误。因此,我查看了我的UI项目的debug文件夹,发现
EntityFramework.dll
由于DAL对它的依赖性而被复制到该文件夹中。我还注意到
EntityFramework.SqlServer.dll
s未复制到调试文件夹,尽管DAL也依赖于它

我将
EntityFramework.SqlServer.dll
复制到UI项目的调试文件夹中,然后重新运行该项目,Viola!我的代码按预期运行


这里的问题似乎是一个dll没有像预期的那样复制到UI项目调试文件夹中。

您必须在所有层(引用它)中安装EF dll。我不知道为什么有必要这样做。我希望我们能找到能够解释的人。