2016-04-10 6 views
0

私は、データアクセス層でデータベースアクティビティを実行するn層アプリケーションを持っています。私はデータアクセス層に、データアクセス層のリポジトリからのタスクを実行するように頼むアプリケーション層を持っています。私のユーザーインターフェイスは、今のところ単純なコンソールアプリケーションであり、結果をテストするためのものです。アプリケーションレイヤに、アプリケーションレイヤがリポジトリから取得し、すべてがコンソールアプリケーションに戻ってくるデータのリストを取得するように要求します。アクセスが自分のデータアクセスレイヤーに限定されていても、参照されるEntity FrameworkがMy UIに必要ですか?

私は私のコンソールアプリケーションの基準とエンティティフレームワークを追加しない場合、私は次のエラーを取得する:コンソールアプリケーションがデータアクセス呼び出しを行うものではありませんかとき

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が参照されているデータアクセスレイヤーで行われます。

アップデート:以下 は私のコンソールインターフェイスである:以下

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を参照してください。

エンティティフレームレジストリを実行する構成セクションを削除すると、同じことが起こりますエラー。私はまた、リポジトリ層がロードされた設定ファイルのEFの設定を探すために起こっているapp.configを

+0

UIレイヤは、データレイヤで使用されているORMについて知るべきではありません。これは、ある種のエンティティを返すことを約束するインタフェースに対してのみプログラムする必要があります。 –

+0

@LeonCullens ok私はそれを得た。そして、アプリケーション層サービスを使用するために依存関係注入を使用しています。なぜ、Entity Frameworkへの参照がないと上記のエラーが発生するのですか?私のコンソールアプリケーションにはその機能は何も言及されていませんか? – Robertcode

+0

私はあなたのapp.configに上記のアセンブリ(DbFactoryなど)への参照があると思います。これらを削除してもう一度やり直してください。 –

答えて

4

にこれらのエントリを追加私の解決策の慰めプロジェクトにEntityFrameworkを追加する場合

すべてのこれらのエラーは、離れて行きます実行中のアプリドメインのだから、あなたのコンソールアプリは設定が必要で、それにEFリファレンスが必要です。リポジトリが外部サービスや別のプロセスにあった場合は、EF参照は必要ありません。

+0

あなたの応答は私にとって理にかなっています。私の各レイヤーは別々のプロジェクト(UI、App Services、ドメイン、インフラストラクチャ - データアクセス)に入っています。 UIの下にあるすべてのレイヤーは別々のアセンブリ(DLL)として作成されますが、UI(この場合はコンソールアプリケーション)のみが.EXEを出力します。つまり、実行中のアプリケーションです – Robertcode

0

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

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

関連する問題