web-dev-qa-db-ja.com

エンティティフレームワーク4.3のコードファーストでデフォルトのスキーマ名を変更できますか?

現在、私はアプリケーションを共有ホスティング環境にデプロイしていますが、1回のマイナーな中断を除いて、移行を伴うコードファーストはうまく機能しています。サイトをプッシュするたびに、「Update-Database -script」オプションを使用する必要があります。すべてのテーブル名の先頭に[dbo]は、デフォルトで共有ホストがデータベースのユーザー名と同じ名前のデフォルトのスキーマ名を作成するためです。

共有ホストにログインしてデータベースを作成する場合、ユーザーを作成する必要があります。このユーザーにadminという名前を付けると、adminとしてログインしているときにコードファーストで作成されるテーブルは、「[admin]。[BlogPosts]」のようになります。アプリケーションを実行すると、すべてのテーブルが作成されますが、「[dbo]。[BlogPosts]」が無効であると表示されるため、EF例外が発生します。テーブルのスキーマ名を「[admin]」で​​はなく「[dbo]」に変更すると、それが修正されます。

これを回避するには、手動で実行する移行スクリプトを生成し、すべてのテーブル名の前に「[dbo]」を追加する必要があります。これは、スクリプトがスキーマと名前ではなく名前でテーブルを参照するためです。

これを回避する簡単な方法はありますか?私がしなければならないのは、アプリケーションを公開するだけで、すべてがうまくいったなら、それはとてもいいことです。スキーマ名の不一致がなければ、ワンクリックでデプロイされ、すべてが素晴らしいものになります。

48
Chev

ToTableメソッドを使用して、スキーマ名を指定できます。スキーマ名を指定しない場合、EFは慣例によりdboを使用します。

public class MyContext
{
    private string schemaName = "Foo";

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
    } 
}
32
Eranga

Entity Framework 6を​​使用している場合は、HasDefaultSchemaメソッドを使用します。

public class Contexto : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
    }
}
130
ferhrosa

データベースの最初の実装では、簡単です。 edmxファイルを開き、右クリックして[プロパティ]をクリックし、デフォルトのデータベーススキーマを設定します。

最初のコードについては、この記事が最も有望と思われます。 http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design

7
Bill

これはC#用であるため追加したいと思います。VB用に以下を書きました

Public Class ClientDbContext
Inherits DbContext
Public Property Clients As DbSet(Of Client)

Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
    modelBuilder.HasDefaultSchema("dbo")
End Sub
End Class
4
petrosmm

EF Code firstでは、デフォルトで、すべてが管理アクセス「DBO-のユーザーアクセスに基づいてセットアップされます。 SQL Serverのスキーマ」。ただし、特定のユーザーが共有ホスティングで一般的なデータベースを使用するように定義されている場合、Dbo管理アクセスはなくなります。今回は、テーブルの名前はdbo.tableName、たとえばsomeUser.tableNameであり、この点が不正確だとプログラムを実行できなくなります。データベースに接続しているユーザーを変更して明示的に割り当てること。 メタデータを使用する場合は、次の方法を使用する必要があります

[Table("MyTableName", Schema="MySchemaName")]
public class MyClassName
{
 //Other Lines...
}

OrFluent APIは次のようにカスタマイズ可能です。)

modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");

次のことに注意してください。 enter image description here

研究のための良いリファレンス: http://www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/

4
BehrouzMoslem