0

私は、私はメモリにこれらのオブジェクトを保持しないEF6は、マップされたDBタイプの主キーに対してオブジェクトを自動的にチェックできますか?

public void PersistToDB<T>(T object) 
{ 
using(var dbContext = ...) 
{ 
    //if(dbContext.Set<T>.Any(x => x.PrimaryKeyMatches(object))... 
} 
} 

...外部ソースが私を送信するとき、私はこのような仕事をしたいDBを永続化するために、オブジェクトと呼ばれる一般的な方法を持っていますINSERTまたはUPDATEのどちらかを保存するだけです。私の問題は、オブジェクトが存在するかどうかを見つけるためにdbContext.Set<T>.Any(x => x.id == object.id)またはdbContext.Set<T>.Find(object.id)を行うことができますが、検索するフィールドを知る必要があります。 EFはどのフィールドがTのPKを定義しているかを知っているので、objectを渡すことができ、私のために自動的にこれを行うか、私にAnyに渡すことができるデリゲートを提供します。

dbContext.Entry(object)を呼び出すと、私はそれを理解し、...私がやりたいことではなく、ローカルコピーが保持されていないとして指定されたオブジェクトがDetached状態である私に教えてくれる、ないを行います。

きちんとしたジェネリック実装を損なうタイプ固有のコードを書かなくても、私ができることは何ですか?

編集:Generic Way to Check If Entity Exists In Entity Framework?の内容に基づいていますが、これは多くがカバーされていると思います。私が実際に務めているのは、委任/ ACtionを作成する方法です。Any(x => func(x))

+0

リフレクションを使用せずに、またはすべてのエンティティの主キーを定義する基本クラス/インターフェースを使用せずにこれを行う方法はないと思います。 – DavidG

+0

私はEFにプライマリキーが何であるかを教えているので(データアノテーションではなくFluent APIを使用しています)、知っておく必要があります。実際に特定の操作について知っていないのですか? –

+0

私はそれが知っていると思うが、あなたが尋ねることを期待していない!多分これが助けになるでしょうか? http://stackoverflow.com/a/6019273/1663001 – DavidG

答えて

0

私自身の質問に答えるために、これは私がやったことです。タイプに基づいて自動的にPKを生成することはできますが、その周りにラムダ式を動的に生成する方法はありません。だから、Anyルートではなく、ルートに行かなければならなかった。これは、DBから各オブジェクトを引き出すというわずかな問題がある。しかし、これは、実際に変更された列だけが、少なくとも部分的に緩和すると思われる既存のオブジェクトで更新されることを意味します。

 using(var dbContext = ...) 
     { 
      var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
      var objectSet = objectContext.CreateObjectSet<T>(); 
      string entitySetName = objectSet.EntitySet.Name; 

      //find the PK columns and values for this type and instance 
      var entityKey = objectContext.CreateEntityKey(entitySetName, item); 
      var pk = entityKey.EntityKeyValues.Select(_ => _.Value).ToArray(); 

      var entity = dbContext.Set<T>().Find(pk); 

最初の部分の効率はわかりませんが、明らかにこれをある程度キャッシュできます。

関連する問題