5

Entity Framework 4.3.1 CodeFirstを使用していて、テーブルを最終的に配置するスキーマを尊重するように移行またはスクリプトを取得することができません。

デフォルトの動作(私が何をしているかに関係なく表示される動作)は、実際に実行されるSQLからスキーマを完全に省略することで、移行またはスクリプトを実行するユーザーのデフォルトスキーマにテーブルが作成されるようです。

私のDBAは、私がADグループの一部であり、ローカルユーザーではないため、デフォルトスキーマを変更できないと言っています。そのため、スクリプトを実行しているユーザーのデフォルトスキーマを変更することはできません(多くの場合、推奨される回避策)。まったくオプション。

私は次のような注釈を使用してみました:

[Table("MyTable", Schema = "dbo")]
public class MyTable
{
    public int Id { get; set; }

    public string MyProp1 { get; set; }

    public string MyProp2 { get; set; }
}

そして、私は同じことの流暢な変種を使ってみました:

modelBuilder.Entity<YourType>().ToTable("MyTable", "dbo");

結果のスクリプト(および移行)は、スキーマを指定しようとしたという事実を無視します。スクリプトは次のようになります。

CREATE TABLE [MyTable] (
    [Id] [int] NOT NULL IDENTITY,
    [MyProp1] [nvarchar](max),
    [MyProp2] [nvarchar](max),
    CONSTRAINT [PK_MyTable] PRIMARY KEY ([Id])
)

[dbo]が次のようにそこに押し込まれている必要がある場合:

CREATE TABLE [dbo].[MyTable] (
    [Id] [int] NOT NULL IDENTITY,
    [MyProp1] [nvarchar](max),
    [MyProp2] [nvarchar](max),
    CONSTRAINT [PK_MyTable] PRIMARY KEY ([Id])
)

他の誰かがEntityFrameworkにスキーマを尊重させることに幸運がありましたか?この動作は、エンタープライズ環境でコードファーストを使用する能力をほとんど損ないます。

注意:ユーザーを別のデフォルトスキーマに変更することは、まったくオプションではありません。

4

2 に答える 2

5

私のコメントは難問に答えたようですので、私はそれを答えとして再現しています。

SQL Serverプロバイダーはデフォルトのスキーマとして「dbo」を使用しているため、構成で「dbo」を指定しても、テーブルを作成するTSQLに明示的に「dbo」を追加しないようです。

これは基本的な問題に答えます。しかし、dboがデフォルトであるかどうか知りたいのですが、あなた(Bob)にはまだそれを指定する理由がありますか?コードを読んでいる人にデフォルトをわかりやすくしたいだけの場合は、構成に含めることは問題ありません。しかし、その行動は別の副作用を生み出していますか?

追加:ああ!EF5で修正されました!:)(EF5RC(.NET 4.0に対して)を使用するようにテストプロジェクトを更新したところ、テーブルを作成するためにTSQLで明示的に「dbo」を取得しました。)

于 2012-05-22T16:59:24.980 に答える
0

ボブ・ブランドが試したすべてのものを試しましたが、同様の成功はありませんでした(Entity Framework 4.3.1 CodeFirstも使用していました)。次に、生成された移行を次のように変更しましたが、機能しました。多分これは誰かの数分の痛みを救うでしょう?

したがって、私の解決策は、通常どおり移行を生成し、次にdbo.示すように手動でハックして含めることでした。

    public override void Up()
    {
        CreateTable(
            "dbo.UploadedFiles", // See? I have added dbo. to the front of my table name :-)
            c => new
                {
                    UploadedFileId = c.Guid(nullable: false, identity: true),
                    // other columns omitted for brevity...
                    FileData = c.Binary(),
                })
            .PrimaryKey(t => t.UploadedFileId);
    }

ダウンビットは次のようになります

   public override void Down()
    {
        DropTable("dbo.UploadedFiles"); // See? I have added dbo. to the front of my table name here too :-)
    }
于 2012-07-02T15:18:24.843 に答える