0

データ アクセス レイヤーでデータベース アクティビティが実行される n 層アプリケーションがあります。データアクセス層のリポジトリからタスクを実行するようデータアクセス層に要求するアプリケーション層があります。今のところ、結果をテストするための単純なコンソール アプリである私のユーザー インターフェイスは、アプリケーション層にデータのリストなどを取得するように要求します。データのリストは、アプリケーション層がリポジトリから取得し、すべてがコンソール アプリに返されます。

コンソール アプリでエンティティ フレームワークを参照として追加しないと、次のエラーが発生します。

不変名 'System.Data.SqlClient' を持つ ADO.NET プロバイダーのアプリケーション構成ファイルに登録されている Entity Framework プロバイダー タイプ 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' を読み込めませんでした。アセンブリ修飾名が使用されていること、およびアセンブリが実行中のアプリケーションで使用可能であることを確認してください。詳細については、http: //go.microsoft.com/fwlink/?LinkId=260882を参照してください。

コンソール アプリがデータ アクセス呼び出しまたはエンティティ フレームワーク操作を行わないのに、なぜこのエラーが発生するのですか? これはすべて、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 セクションとデータベース文字列を削除すると、次のエラーが発生します。

{"指定されたスキーマは有効ではありません。エラー: \r\nModelEntities.ssdl(2,2): エラー 0152: 不変名 'System.Data.SqlClient' を持つ ADO.NET プロバイダーの Entity Framework プロバイダーが見つかりません。プロバイダーは、アプリケーション構成ファイルの 'entityFramework' セクションに登録されています。詳細については、 http: //go.microsoft.com/fwlink/ ?LinkId=260882 を参照してください。"}

次に、entityframework の登録を行う構成セクションを削除すると、同じエラーが発生します。

ソリューションのコンソール プロジェクトに EntityFramework を追加すると、これらのエラーはすべてなくなります。これにより、これらのエントリも app.config に追加されます。

4

2 に答える 2

4

リポジトリ レイヤーは、実行中のアプリ ドメイン用に読み込まれた構成ファイルで EF 構成を探します。そうです、コンソール アプリには構成が必要であり、それには EF 参照が必要です。リポジトリが外部サービスまたは別のプロセスにある場合、EF 参照は必要ありません。

于 2016-04-11T00:38:02.950 に答える
0

データ/リポジトリ レイヤーのみが Db 関連の dll/ロジックを知っている必要がありますが、エンティティ フレームワークで同じ問題に直面しました。MSBuild は、この EF SQL dll を bin/debug フォルダーにコピーしていませんでした。この dll を UI プロジェクトに含める必要がありました。

理由は、私の記憶が正しければ、MSBuild が実行しようとしていたいくつかのインテリジェントな処理によるものです。つまり、ある種の依存関係ツリーで参照が見つからない場合、出力または bin/debug フォルダーに含まれません。 . (これのソースは覚えていません)

于 2016-04-11T00:49:00.790 に答える