データ アクセス レイヤーでデータベース アクティビティが実行される 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="data source=WIN-2012-SRVR-3;initial catalog=MDIS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 に追加されます。