即使访问仅限于我的数据访问层,我是否需要 Entity Framework 在我的 UI 中引用?

Do I need Entity Framework Referenced In My UI even if access is limited to my data access layer?

我有一个 n 层应用程序,其数据库 activity 在我的数据访问层中执行。我有一个应用层,它要求我的数据访问层从数据访问层的存储库中执行任务。我的用户界面,目前是一个简单的控制台应用程序,用于测试结果,它要求我的应用程序层获取诸如数据列表之类的东西,而应用程序层又从存储库中获取这些数据,然后全部返回到控制台应用程序。

如果我不在我的控制台应用程序中添加 entity framework 作为参考,我会收到以下错误:

The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

当控制台应用程序没有进行数据访问调用或 entity framework 操作时,为什么我会收到此错误消息?所有这些都是在我的数据访问层中完成的,它确实引用了 Entity Framework。

更新: 下面是我的控制台界面:

class MyServices
{
    IProductRequestServices _ProductRequestServices;
    public MyServices(IProductRequestServices _ProductRequestServices)
    {
        this._ProductRequestServices = _ProductRequestServices;
    }
    public void ProductList()
    {
        List<ProductRequestDetailDto> aList = _ProductRequestServices.GetProductRequestExtendedDetailAll();
        foreach (ProductRequestDetailDto prodReq in aList)
        {
            System.Console.WriteLine("Product Req ID: {0} - Product Name: {1}",
                prodReq.productRequestId.ToString(), prodReq.productName);
        }
    }
    public void ClientList()
    {
        List<ProductRequestDetailDto> aList = _ProductRequestServices.GetProductRequestExtendedDetailAll();
        foreach (ProductRequestDetailDto prodReq in aList)
        {
            System.Console.WriteLine("Product Req ID: {0} - Product Name: {1}",
                prodReq.productRequestId.ToString(), prodReq.firstName + " " + prodReq.lastName);
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
     ProductRequestServices _ProductRequestServices = new ProductRequestServices();

     MyServices MyServices = new MyServices(_ProductRequestServices);

        MyServices.ProductList();
        System.Console.WriteLine("============================");
        MyServices.ClientList();
        System.Console.ReadLine();
    }
}

下面是App.config。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <connectionStrings>
    <add name="MDISContext" connectionString="metadata=res://*/ModelEntities.csdl|res://*/ModelEntities.ssdl|res://*/ModelEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=WIN-2012-SRVR-3;initial catalog=MDIS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

如果我只是删除 entityFramework 部分和数据库字符串,我会收到以下错误:

{"Schema specified is not valid. Errors: \r\nModelEntities.ssdl(2,2) : error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information."}

然后,如果我删除执行 entityframework 注册的配置部分,我会得到同样的错误。

如果我将 EntityFramework 添加到我的解决方案的控制台项目中,所有这些错误都会消失,该项目还将这些条目添加到 app.config

存储库层将在为 运行 应用程序域加载的配置文件中查找 EF 配置。所以是的,您的控制台应用程序需要配置并且需要 EF 引用。如果您的存储库位于外部服务或其他进程中,那么您将不需要 EF 引用。

只有数据/存储库层应该知道与 Db 相关的 dll/逻辑,但我遇到了与 entity framework 相同的问题。 MSBuild 未在 bin/debug 文件夹中复制此 EF SQL dll。我必须将此 dll 包含在我的 UI 项目中。

原因,如果我没记错的话,是因为 MSBuild 试图做一些智能的事情,即:如果它无法在某种依赖树中找到引用,它不会将其包含在输出中或 bin/debug 文件夹。 (不记得出处了)