2011-07-07 7 views
2

SQL Server上でVS2008(.NET 3.5)およびEntity Frameworkを使用しています。私はInclude()メソッドを使用せずに外部キー列の値を取得してテーブルをリンクすることを望んでいます。エンティティフレームワーク1.0の外部キー値をインクルードメソッドなしで取得します。

たとえば、単純なAuthorにはBooksサンプルが多数あります。

var book = context.Books.First(); 
int authorId = book.Author.AuthorId; 

このシナリオでは、Authorがnullなので、例外がスローされます。著者IDを取得するだけですが、Authorオブジェクトの残りの部分は必要ありません。 BookクラスにはAuthorIdというプロパティはありません。

おそらく、EDMXを直接編集したり、デザイナーから何かを始めるにはどうすればいいのでしょうか?

ありがとう

+0

私は本のエンティティであっAuthorIDされていない驚いています。データベースに外部キーが定義されていますか?もしそうなら、EFモデルジェネレーターがそれを取り上げるべきです。 –

+0

EF4では、外部キーのプロパティを公開せずにエンティティリンクを作成することができます。プロ:エンティティオブジェクトはよりクリーンです。 contra:外部キーの値に簡単にアクセスすることはできません – Eilistraee

+0

私が覚えていれば、EF4にはAuthorIdが含まれていますが、EF1(これは私のものです)ではありません。私が持っているのは、オブジェクトセットの.Include( "Author")を呼び出すときにのみ作成されるAuthorプロパティです。 –

答えて

1

あなたはFK値を得ることができますが、それほど単純ではありません。単一のエンティティを表す各ナビゲーションプロパティは、XXXReferenceというペアプロパティを持つ必要があります。あなたの場合AuthorReference。これは内部的に鍵を保持するEFインフラストラクチャプロパティです。同様のコードを使用してFKの値を取得することができます。

EntityKey key = book.AuthorReference.EntityKey; 
EntityKeyMembers[] keyMembers = key.EnityKeyValues; 
// Now each member of this array contains Key and Value property. Key is the name of 
// primary key property in principal entity and value is its value 
// If you don't have composite keys and your keys are integer you can simply use: 
int authorId = (int)keyMembers[0].Value; 
+0

私が取り組んでいるプロジェクトでは、これらの前提が当てはまるので、これはうまくいくように見えます。ありがとう。 –

1

これはいくつかの箇所で説明していますが、一見価値があるかもしれません。

拡張方法:ご予約するエンティティの部分クラスで

public static TValue GetId<TValue>(this EntityReference reference) 
{ 
    if (reference == null) 
    { 
     return default(TValue); 
    } 

    EntityKey key = reference.EntityKey; 
    if (key != null) 
    { 
     EntityKeyMember[] entityKeys = key.EntityKeyValues; 
     if (entityKeys.Length > 0) 
     { 
      return (TValue)entityKeys[0].Value; 
     } 
    } 

    return default(TValue); 
} 

public int AuthorId 
{ 
    get { return AuthorReference.GetId(); } 
} 
+0

いい実装、ありがとう。 –

関連する問題