サンプルコードはエンティティをコンテキストに依存させるため(また、処理しないでください)、ひどく間違っています。 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
};
ありがとうございます。私は、テーブルの多くのテーブル(そしてしばしばテーブルの多くのカラム)がこの関係を持っていても、モデルに存在するはずの関係であることに気付いたと思います。 「データベースからモデルを作成する」ウィザードは、これらの関係のすべてを捉えていませんでしたが、私はそれらをモデルに追加するだけです。アドバイスをいただければ幸いです。 –