49

Entity Framework 4.1 Code First は、テーブルとリレーションシップの作成に最適です。Code first アプローチを使用して SQL ビューまたはストアド プロシージャを作成することは可能ですか? これに関する指針は高く評価されます。どうもありがとう!

4

7 に答える 7

94

Entity Framework Code First Migrations では、ストアド プロシージャがサポートされています。私たちのアプローチは、.sql ファイルを保持するフォルダーを作成することです (たとえば ~/Sql/)。ストアド プロシージャの作成と削除の両方のために、フォルダに .sql ファイルを作成します。例Create_sp_DoSomething.sqlDrop_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]
于 2013-03-02T07:17:49.807 に答える
27

一見、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

ここで、追加のストアド プロシージャをフォルダーにドロップするだけで、すべてが適切に更新されます。

于 2014-03-28T15:20:41.520 に答える
12

EF コード ファーストのアプローチでは、データベースにロジックがないと想定されます。つまり、ストアド プロシージャもデータベース ビューもありません。そのため、コード ファーストのアプローチでは、そのような構造を自動的に生成するメカニズムが提供されません。ロジックを生成することを意味する場合、どのようにそれを行うことができますか?

作成スクリプトを手動で実行して、カスタム データベース初期化子で自分で作成する必要があります。このカスタム SQL コンストラクトを SQL 移行で処理できるとは思いません。

于 2011-10-05T21:09:51.080 に答える
11

十分に文書化されていないようですが、Entity Framework 6 でAlterStoredProcedureCreateStoredProcedureDropStoredProcedureMoveStoredProcedureRenameStoredProcedureを使用してストアド プロシージャ操作を実行できるようになりました。それらを使用します。

于 2014-11-10T09:22:38.223 に答える
1

Ladislav が指摘したようにDbContext、一般的に はデータベース内のロジックを最小限に抑える傾向がありますが、context.Database.ExecuteSqlCommand()orを使用してカスタム SQL を実行することは可能context.Database.SqlQuery()です。

于 2011-10-05T22:44:17.073 に答える