SQL Server Compact Editionを使用したEntityFrameworkクエリのテスト

すべての深刻な人々と同様に、私たちは単体テストの普及について考えました。 MSpecは、テストの名前がテキストを読んでいるように見えるという事実を一部のチームメンバーが本当に好むという事実のためにプラットフォームとして採用されましたが、キュウリなどとは異なり、かさばるパーサーを書く必要はありません。



単体テストとmokiは間違いなく適切で必要ですが、時々、ベースで動作するコードが全体として正しく動作することを確認したいことがあります。 はい、ストップの足場を適切な場所に置き、重いアプリケーション全体を起動せずにそこに行きたいです。 一般的に、ベースをテストしたいという要望がありました。



最初に、SQLiteを試すことにしました。 小さく、理論的に多くのことを行うことができ、一般的に誰もが彼に精通しています。 これは最初の選択肢としてキックされましたが、SQLiteのプロバイダーによるEntityFrameworkクエリがSQLサーバーのクエリとはまったく異なるように構築されているという事実と突き合わされた後-ルーツにより近いことになりました-Microsoftに。 幸い、.NETの世界ではいつものように、選択できる実装は多くありませんが、それらは非常に深刻です。 一般に、SQL Server CEを入手することが決定されました。



すぐに困難があります。 MSSQLの下にedmxファイルが必要なので、その中にSQL CEへの参照がありません。 この問題を簡単かつ積極的に解決します。 テストt4テンプレート(.tt)を使用してプロジェクトに追加し、スキームの説明を使用して必要な操作を行います。



始めるには、通常の手でNugetパッケージを置きます

Install-Package SqlServerCompact Install-Package EntityFramework.SqlServerCompact
      
      







次に、edmxからSSDLを抽出し、プロバイダーをその中のSQL CEに置き換え、SQL Server固有のSQL CEサブセットから型を引用します。

 ... <# var di = new DirectoryInfo(Host.ResolvePath("..\\DataAccessLayer\\")).FullName; var xmlDocument = new XmlDocument(); xmlDocument.Load(Path.Combine(di,"Entities.edmx")); var xmlNamespaceManager = new XmlNamespaceManager(xmlDocument.NameTable); xmlNamespaceManager.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2009/11/edmx"); xmlNamespaceManager.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl"); //  SSDL  EDMX var selectSingleNode = xmlDocument.SelectSingleNode("//ssdl:Schema[@Namespace='___']", xmlNamespaceManager); //  Provider ((XmlElement) selectSingleNode).SetAttribute("Provider", "System.Data.SqlServerCe.4.0"); //   //  foreach (XmlElement node in xmlDocument.SelectNodes("//ssdl:Property[@Type='varbinary(max)']", xmlNamespaceManager)) { node.SetAttribute("Type","image"); } #>
      
      







その後、特別に準備されたssdlを取得し、それをコンテキストにフィードします。

まず、それをリソースにします-オブジェクトのプロパティで、プロジェクトの場合には、LogicalNameタグを使用して標準名よりも適切なものを登録できます

  <EmbeddedResource Include="SqlCompact.ssdl"> <AutoGen>True</AutoGen> <DesignTime>True</DesignTime> <DependentUpon>SqlCompact.tt</DependentUpon> <LogicalName>SqlCompact.ssdl</LogicalName> </EmbeddedResource>
      
      





EFがコンテキスト用に作成したテンプレートでは、デフォルトのコンストラクターをプライベートにし、追加したパブリックコンストラクターは常にIConnectionStringパラメーターを必要とし、その実装は全員にConnectionStringを提供します。 プロジェクトコードでは、このインターフェイスは標準実装の発行にマップされます。 テストの場合、IConnectionStringの実装は、System.Data.SqlServerCe.4.0およびPersist Security Info = Trueとしてプロバイダーを返す必要があります。そうでない場合は、起動しません。 さらに、connectionStringでは、元のssdlを、上記のリソースに生成およびコンパイルされたもので置き換える必要があります。



entities.Database.Create()を作成するためのテストを書き始め、以前よりも少しテストする機会を楽しみます。



合計:

1)パッケージを入れる

2)t4でSSDLをかみ、その中の型を変更します

3)SSDLおよび接続文字列のプロバイダーを変更します(nugetにバグがある場合は、App.configでも)



それでもSQLiteが必要な場合は、アルゴリズムは似ていますが、自動インクリメントタイプの実装が不器用であるため、自分でテーブルの作成を開始する必要があり、外部キーを忘れることがあります。



All Articles