Entity Framework 4.1 Code First は、テーブルとリレーションシップの作成に最適です。Code first アプローチを使用して SQL ビューまたはストアド プロシージャを作成することは可能ですか? これに関する指針は高く評価されます。どうもありがとう!
7 に答える
Entity Framework Code First Migrations では、ストアド プロシージャがサポートされています。私たちのアプローチは、.sql ファイルを保持するフォルダーを作成することです (たとえば ~/Sql/)。ストアド プロシージャの作成と削除の両方のために、フォルダに .sql ファイルを作成します。例Create_sp_DoSomething.sql
とDrop_sp_DoSomething
. SQL はバッチで実行され、バッチCREATE PROCEDURE..
の最初のステートメントである必要があるためCREATE PROCEDURE...
、ファイルの最初のステートメントを作成します。GO
また、 .の後には付けないでくださいDROP...
。リソース ファイルがまだない場合は、プロジェクトに追加します。.sql ファイルをソリューション エクスプローラーからリソース デザイナーの [ファイル] ビューにドラッグします。空の移行 ( Add-Migration SomethingMeaningful_sp_DoSomething
) を作成し、次を使用します。
namespace MyApplication.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class SomethingMeaningful_sp_DoSomething : DbMigration
{
public override void Up()
{
this.Sql(Properties.Resources.Create_sp_DoSomething);
}
public override void Down()
{
this.Sql(Properties.Resources.Drop_sp_DoSomething);
}
}
}
~/Sql/Create_sp_DoSomething.sql
CREATE PROCEDURE [dbo].[sp_DoSomething] AS
BEGIN TRANSACTION
-- Your stored procedure here
COMMIT TRANSACTION
GO
~/Sql/Drop_sp_DoSomething.sql
DROP PROCEDURE [dbo].[sp_DoSomething]
一見、Carl G のアプローチが気に入っていますが、多くの手作業が必要です。私のシナリオでは、常にすべてのストアド プロシージャ、ビューを削除し、データベースに変更があるたびにそれらを再作成します。このようにして、すべてが最新バージョンで最新であることを確認します.
再作成は、次の初期化子を設定することによって行われます。
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
次に、移行の準備ができているときはいつでもシード メソッドが呼び出されます。
protected override void Seed(DeploymentLoggingContext context)
{
// Delete all stored procs, views
foreach (var file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sql\\Seed"), "*.sql"))
{
context.Database.ExecuteSqlCommand(File.ReadAllText(file), new object[0]);
}
// Add Stored Procedures
foreach (var file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sql\\StoredProcs"), "*.sql"))
{
context.Database.ExecuteSqlCommand(File.ReadAllText(file), new object[0]);
}
}
SQL ステートメントは、簡単に編集できるように *.sql ファイルに保存されます。ファイルの「ビルド アクション」が「コンテンツ」に設定され、「出力ディレクトリにコピー」が「常にコピー」に設定されていることを確認します。フォルダーを検索し、内部のすべてのスクリプトを実行します。ExecuteSqlCommand() で実行できないため、SQL 内の「GO」ステートメントを除外することを忘れないでください。
現在のディレクトリ レイアウトは次のとおりです。
Project.DAL
+ 移行
+ Sql
++ シード
+++ dbo.cleanDb.sql
++ StoredProcs
+++ dbo.sp_GetSomething.sql
ここで、追加のストアド プロシージャをフォルダーにドロップするだけで、すべてが適切に更新されます。
EF コード ファーストのアプローチでは、データベースにロジックがないと想定されます。つまり、ストアド プロシージャもデータベース ビューもありません。そのため、コード ファーストのアプローチでは、そのような構造を自動的に生成するメカニズムが提供されません。ロジックを生成することを意味する場合、どのようにそれを行うことができますか?
作成スクリプトを手動で実行して、カスタム データベース初期化子で自分で作成する必要があります。このカスタム SQL コンストラクトを SQL 移行で処理できるとは思いません。
十分に文書化されていないようですが、Entity Framework 6 でAlterStoredProcedure、CreateStoredProcedure、DropStoredProcedure、MoveStoredProcedure、RenameStoredProcedureを使用してストアド プロシージャ操作を実行できるようになりました。それらを使用します。
Ladislav が指摘したようにDbContext
、一般的に はデータベース内のロジックを最小限に抑える傾向がありますが、context.Database.ExecuteSqlCommand()
orを使用してカスタム SQL を実行することは可能context.Database.SqlQuery()
です。