2011-07-08 15 views
0

私は参照モデルを記録するためのカスタムモデルを使用するデータベース(状態、型など)を持っています。したがって、すべてのデータベーステーブルには、整数を格納し、code_valueテーブルを参照してその状態の値(つまり「CA」、「AK」など)を取得するstate_cdv_idなどのさまざまな列があります。生成されたEFモデルの共通コード値テーブルへのアクセス

これらのフィールドのコード値にアクセスできるようにEFモデルをマップしたいと思います。すべてのエンティティの部分クラスで手動で行う必要はありません。繰り返すだから私はMyPerson.Stateのようなコード値にアクセスし、文字列 "CA"を返すことができるようにしたい。私は最善のアプローチがどうなるか分からない

public string State 
    { 
     get 
     { 
      MyEntityContext c = new MyEntityContext(); 
      return c.CodeValues.Single(cv => cv.Id == RecordStatusCdvId).Value; 
     } 
    } 

:ここ

は、単一のゲッターが、私はそれを手動で行うにした場合、私は何度も繰り返さなければならないだろうということでしょう何T4テンプレートを変更します特定のフィールドにプロパティ属性を追加し、プログラムでそれらを取得するか、または他のものを追加します。

助けが必要ですか?

答えて

1

1がある場合:エンティティとcode_valueテーブル間の1の関係は、エンティティがすでにデフォルトで、デフォルトではnullになりますState性質を有していなければならない、あなたは、あなたの上Includeを使用して、それを埋めることができDBクエリ:

var foo = context.MyEntities.Include(x => x.State); 
+0

ありがとうございます。私は、テーブルの多くのテーブル(そしてしばしばテーブルの多くのカラム)がこの関係を持っていても、モデルに存在するはずの関係であることに気付いたと思います。 「データベースからモデルを作成する」ウィザードは、これらの関係のすべてを捉えていませんでしたが、私はそれらをモデルに追加するだけです。アドバイスをいただければ幸いです。 –

1

サンプルコードはエンティティをコンテキストに依存させるため(また、処理しないでください)、ひどく間違っています。 POCO全体のアプローチは、これを回避するだけです(POCO T4ジェネレータとDbContext T4ジェネレータ)。

データベース内のルックアップテーブルとの関係がある場合は、EFがナビゲーションプロパティを作成します。データベースにこのような関係がなく、EDMXファイルを使用している場合でも、モデルにこのようなリレーションを作成することができます。また、ルックアップテーブルのナビゲーションプロパティが再度取得されます。あなたはナビゲーションプロパティを持っていたら、あなたは、単に行うことができます。

string code = myEntity.State.Code; 

しかし、ナビゲーションプロパティは、熱心なロード(@BrokenGlassが説明したように)または遅延読み込みのいずれかによってロードする必要があります。

ナビゲーションプロパティのアイデアが気に入らず、Stateプロパティに状態のコードを表示させたい場合は、それが何を意味するのかを理解する必要があります。エンティティをそのようにマップすると、読み取り専用になりますEFは複合エンティティを更新する必要のある実表に戻すことはできません。エンティティを任意の方法でマップすることは可能ですが、EDMXファイル(コードの最初のアプローチではない)を持っている場合にのみ機能する高度な(ほとんどは必要ではない)シナリオと見なされます。選択肢は次のとおりです。

  • データベースビューを作成し、新しいエンティティ
  • にビューをマップファイル(XMLとして開く)を手動EDMXにDefiningQueryを作成し、あなたが更新できないことをやるたら(新しいエンティティにマッピングデータベースからモデルまたはそれ以上のモデルからデータベースを生成)
  • EDMX(XMLとしてオープン)ファイルに手動でQueryViewを作成し、新しいエンティティにマッピング(これはすでにマップされる元のエンティティが必要です)

あなたはすべてのテーブルwhのためにそれをしなくてはなりませんあなたはそのようなマッピングをしたいのですか?とにかく全体のあなたは、単にのようなカスタムクラスを作成することができますので、手動でEDMXを変更すると複雑さは必要とされていないこと:

public class SomeViewModel // I suppose your main target is to have codes in presentation layer 
{ 
    public string SomeData { get; set; } 
    public string State { get; set; } 
} 

を、あなたはナビゲーションプロパティを持っている場合は、投影クエリ

を使用します。

var data = from x in context.SomeEntities 
      select new SomeViewModel 
       { 
        SomeData = x.SomeData, 
        State = x.State.Code 
       }; 

あなたの場合ナビゲーションプロパティがありません

var data = from x in context.SomeEntities 
      join y in context.LookupValues on x.LookupId equals y.Id 
      select new SomeViewModel 
       { 
        SomeData = x.SomeData, 
        State = y.Code 
       }; 
関連する問題