2012-02-24 10 views
4

私たちのデータベースは、生産のためのさまざまなスキーマとテスト用のさまざまな同等のスキーマがあるように設計されています。たとえば、多くのテーブルはMyProductionスキーマ内にあり、同じテーブルはMyTestスキーマ内にあります。コードファースト(Entity Framework)とDbContextを使用してエンティティのスキーマ名を取得するにはどうすればよいですか?

私がしたいのは、テーブルがどのスキーマを使用しているかを判断することで、どのスキーマに変更するかを知っています。したがって、デフォルトでは、すべてが本番スキーマの下に置かれます。 DbContextのOnModelCreatingイベントで、テストを指し示す必要がある場合(真/偽の設定によって決まる)、使用されているプロダクションスキーマを判断し、それに相当するテストを指す必要があります。

私はすでにスキーマの設定方法を知っていますが、スキーマの入手方法はわかりません。どのように私はテーブルが使用しているスキーマを決定することができます任意のアイデア?

ありがとうございます。

+0

あなたはそれを取得する必要はありません - あなたはマッピングを担当しているあなたはどのスキーマとテーブルを定義するように、エンティティはにマップされます。 –

+0

私はそれが必要です。私は使用する必要がある少なくとも6つの別々のスキーマを持っています。 3つのスキーマはテスト用で、3つはプロダクション用です。それぞれに100sのテーブルがあります。 thisAnonymousTableがこのプロダクションスキーマを使用している場合、可能な設定でそれぞれ100個のテーブルの3つの別々のリストを管理するのではなく、MyTestSchema(必要に応じて)に変更します。私のクラスとコンテキストは、CodeFirstTemplateジェネレータによってEDMから生成されているため、スキーマを入手する必要があります。私の質問はそうではありませんでした、私はそれをする必要がありますか?私の質問はhow.ThankYouです。 –

+0

これは問題ですが、Entity Frameworkに切り替える前にNHibernateでこれを行うことができます。 Entity Frameworkの方がはるかに優れていますが、この機能を実装する必要があります。なぜなら、OnModelCreatingイベントでこの機能を実装することを望んでいるからです。 –

答えて

-1

Entity Frameworkスキーマは、System.ComponentModel.DataAnnotations.TableAttributeオブジェクトです。次に、エンティティのスキーマ名とテーブル名を取得するために使用できるいくつかのメソッドを示します。乾杯!あなたに応じてローカル設定を変更した後のコードの下に

private string GetTableName(Type type) 
    { 
     var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault(); 
     if (tableAttribute != null && !string.IsNullOrEmpty(tableAttribute.Name)) 
     { 
      return tableAttribute.Name; 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 

    private string GetTableSchema(Type type) 
    { 
     var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault(); 
     if (tableAttribute != null && !string.IsNullOrEmpty(tableAttribute.Schema)) 
     { 
      return tableAttribute.Schema; 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
+0

投票の理由を教えてもらえますか? – Tarzan

-1
System.ComponentModel.DataAnnotations.Schema.TableAttribute 
0

試してみてください:

var context = new YouDbContext("ConnectionName"); 
var adapter = (IObjectContextAdapter)context; 
var objectContext = adapter.ObjectContext; 
EntitySetBase schema = null; 
if (objectContext.MetadataWorkspace != null) 
{ 
    schema = objectContext.MetadataWorkspace 
     .GetItems<EntityContainer>(DataSpace.SSpace).First() 
     .BaseEntitySets 
     .First(meta => meta.ElementType.Name == "ClassNameUnderYourDbContext"); 
} 
//See the properties of schema in debug mode to understand details 
+0

すべてのスキーマを取得する場合は、最初の(...)部分をクエリーから削除します。 –

+0

参照http://stackoverflow.com/questions/18587865/how-to-get-name-of-schema-from-entity-framework/18591456#18591456 –