2012-02-14 5 views
5

は、エンティティフレームワーク4.0コード最初のエンティティDBContextにアタッチする前に、属性だけでEF 4コードの最初のエンティティの[Key]を取得する方法はありますか?

public class MyEntity 
{ 
    [Key] 
    public int MyEntityId { get; set; } 
} 

プロパティの名前を知らなくても、[キー]属性で装飾されたプロパティの値を取得する方法はありますが与えられましたか?

public class KeyReader<TEntity> : where TEntity : class 
{ 
    public int GetKeyValue(TEntity entity){ 
    //get key value for entity 
    } 
} 

UPDATE

私はDBContextを持っているので、私は次のコードを使用することができます:

var objectContext = ((IObjectContextAdapter) myContext).ObjectContext; 
objectContext.ObjectStateManager.GetObjectStateEntry(entity).EntityKey.EntityKeyValues; 

しかし、実体後にこの唯一の作品が追加されたりDBContextに添付されていますが。問題は、キーやその値の動的知識を使用して、挿入または更新を実行するかどうかを判断し、コンテキストに追加または添付するかどうかを判断することでした。このコードが可能になるまでには、これは遅すぎます。

これを反映する質問タイトルを編集しました。

これ以上の考えはありますか?

答えて

7

別の可能な解決策は、[Key]属性で飾られているプロパティを見つけるためにリフレクションを使用して、その値を返すために、次のようになります。この方法が唯一のその最初のプロパティの値を返すこと

private object GetKeyValue<T>(T entity) where T : class 
{ 
    PropertyInfo key = 
     typeof(T) 
     .GetProperties() 
     .FirstOrDefault(p => p.GetCustomAttributes(typeof(KeyAttribute), true).Length != 0); 

    return key != null ? key.GetValue(entity, null) : null; 
} 

MyEntity instanceOfMyEntity = new MyEntity { MyEntityId = 999; }; 
object keyValue = GetKeyValue<MyEntity>(instanceOfMyEntity); // keyValue == 999 

は注意KeyAttributeで修飾され、Keyプロパティが見つからない場合はnullを返します。

3

エンティティがObjectContextの場合は、YourContext.GetObjectStateEntry(entity)に電話することができます。これにより、対応するObjectStateEntryオブジェクトが返されます。このオブジェクトには、キー値を格納するEntityKeyプロパティが含まれています。

DbContextを使用している場合、私には同様の機能はありません。ただし、それがない場合でも、IObjectContextAdapter((IObjectContextAdapter)YourContext).ObjectContext)を使用して、基礎となるObjectContextを取得し、上記を使用することができます。

+0

これは間違いありませんが、根本的なインテントの解決に役立たない理由については、私の更新を参照してください。とにかく私はその提案に感謝するので、私は投票しました。 –

+0

あなたはそれを添付して、これを使ってキー値を取得することができます。それを追加する必要がある場合は、 'ObjectStateEntry.ChangeState(EntityState.Added)'を呼び出します。しかし、実際には間違ったことを最初にして、それが間違っているかどうかを確認してから修正します。あなたが受け入れた答えはおそらくより良い考えです。 – hvd

関連する問題