2011-10-18 17 views
0

私はできるだけ明確にしようとするでしょう:EFコードファースト:モデル構成

私の目標を:で、私は宣言したモデル構成を読み取ることが私のDbContext由来私のエンティティクラス内部OnModelCreatingを上書き。

理由:私はTの主キーは、渡されたtoUpdateオブジェクトにそれらを取得し、Set<T>().Find方法でそれらを使用したフィールドを取得する私のデータ層上にジェネリックvoid Update<T>(T toUpdate)方法を構築します。

これは、私が扱うすべてのタイプのエンティティに対してFindロジックをハードコードしないようにするでしょう。

は、私はこのように、アップデートを適用するために保存されたエンティティを取得する必要があります:私はポイントにこだわっている

var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues); 
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate); 

をその(私のエンティティクラスはもちろんのDbContext由来である)私の_entitiesインスタンス内のIモデル構成がどこに保存されているのか分からないようです。

誰でも正しい方向に向けることができますか?

ありがとうございました。

答えて

1

あなたがここにエンティティタイプYourEntityのキープロパティ名取得する方法のコードを見つけることができます。

Entity Framework code first. Find primary key

をそして値を取得:

public Update<T>(T toUpdate) 
{ 
    // Code from link above with YourEntity = T 

    List<object> myRetrievedKeyValues = new List<object>(); 
    foreach (var keyName in keyNames) 
     myRetrievedKeyValues.Add(toUpdate.GetType().GetProperty(keyName) 
      .GetValue(toUpdate, null)); 

    var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues.ToArray()); 
    _entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate); 
} 

あなたはだろうと期待Updateメソッドが非常に遅いです。なぜなら、この一般的なアプローチに反射を使用する必要があるからです。

また、CurrentValues.SetValuesは、スカラープロパティとコンプレックスプロパティのみを更新することを忘れないようにしてください。ナビゲーションプロパティを更新するのに役立つわけではありません。各エンティティタイプに固有の関係を更新するには、非ジェネリックコードを使用する必要があります。

+0

これは完璧でした。私はあなたが投稿したときに、コードの残りの部分を正確に書きました。魅力のように動作します。 –

関連する問題