質問

私はできるだけ明確になろうとします:

私の目標:私がオーバーライドされたモデル構成を読むこと OnModelCreating 私のエンティティクラスの内部から派生したクラス DbContext.

理由:ジェネリックを構築する void Update<T>(T toUpdate) 私のデータレイヤーの方法で、どのフィールドがtの主キーであるかを取得し、合格したものでそれらを取得します toUpdate オブジェクトとそれらを使用します Set<T>().Find 方法。

これにより、私が処理するあらゆるタイプのエンティティのロジックをハードコードで見つけることができなくなります。

このような更新を適用するには、保存されたエンティティを取得する必要があります。

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

私は自分の中で立ち往生しています _entities インスタンス(これは私のエンティティクラスから派生したクラスです DbContext もちろん)モデル構成が格納されている場所を見つけることができないようです。

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

ありがとう。

役に立ちましたか?

解決

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

エンティティフレームワークコード最初。主キーを見つけます

そして、値を取得します。

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 スカラーと複雑なプロパティのみを更新します。ナビゲーションプロパティを更新するのに役立ちません。各エンティティタイプに固有の関係を更新するには、非遺伝子コードを使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top