9

POST リクエストから取得したモデルがあります。私のビューはその POCO タイプを定義しているため、送信されたデータから作成されたオブジェクトも POCO です。POCO であるため、さまざまな仮想プロパティがオーバーライドされません。したがって、これらの仮想プロパティは null を返します。これは、外部キーに基づいて個別のクエリを作成し、そのプロパティをナビゲートする必要があることを意味します (単に保存するよりも複雑なことをしたい場合)。

モデルの POCO が与えられた場合、オーバーライドされた機能をすべて備えたプロキシを取得できますか?

(これが目的だと思っていdb.Entry().Entityましたが、それでもプロキシではなくPOCOオブジェクトが返されます。ブレークポイントの一時停止中にマウスオーバーすることで、オブジェクトのランタイムタイプを調べています。)

4

3 に答える 3

7

このコードの行に沿った何かが、必要なことを行います。オートマッパーを使用して、渡されたエンティティからプロキシされたバージョンに値をコピーしました。

コードは、渡されたエンティティがプロキシであるかどうかをチェックし、それに応じて処理します。

public class Repository<T> where T : class
{
    private readonly Context context;
    private bool mapCreated = false;
    public Repository(Context context)
    {
        this.context = context;
    }

    protected virtual T InsertOrUpdate(T e, int id)
    {
        T instance = context.Set<T>().Create();
        if (e.GetType().Equals(instance.GetType()))
            instance = e;
        else
        {
            if (!mapCreated)
            {
                Mapper.CreateMap(e.GetType(), instance.GetType());
                mapCreated = true;
            }
            instance = Mapper.Map(e, instance);
        }

        if (id == default(int))
            context.Set<T>().Add(instance);
        else
            context.Entry<T>(instance).State = EntityState.Modified;

        return instance;
    }
}

オートマッパーを必要としないコメントで@Colinによって説明されているUPDATEバージョン

public class Repository<T> where T : class
{
    private readonly Context context;
    public Repository(Context context)
    {
        this.context = context;
    }

    protected virtual T InsertOrUpdate(T e, int id)
    {
        T instance = context.Set<T>().Create();
        if (e.GetType().Equals(instance.GetType()))
        {
            instance = e;
        }
        else
        {
            DbEntityEntry<T> entry = context.Entry(instance);
            entry.CurrentValues.SetValues(e);
        }

        context.Entry<T>(instance).State =
            id == default(int)
                ? EntityState.Added
                : EntityState.Modified;

        return instance;
    }
}
于 2013-06-18T12:38:32.857 に答える