62

DbContext.Set のモックに関する他の質問に続いて、 EF Code First のモックに関する別の質問があります。

次のような更新方法があります。

if (entity == null)
    throw new ArgumentNullException("entity");

Context.GetIDbSet<T>().Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
Context.CommitChanges();

return entity;

Context は、私自身の DbContext のインターフェースです。

私が直面している問題は、どのように処理するかです

Context.Entry(entity).State.

私はこのコードをステップ実行しましたが、Context インターフェイスの実装として実際のライブ DbContext がある場合に機能します。しかし、偽のコンテキストをそこに置くと、それを処理する方法がわかりません。

DbEntityEntry クラスのコンストラクターがないため、偽のコンテキストで新しいコンストラクターを作成することはできません。

CodeFirst ソリューションで DbEntityEntry をモックまたは偽造して成功した人はいますか?

または、状態の変化を処理するためのより良い方法はありますか?

4

2 に答える 2

99

他の場合と同様に、必要なのは間接的なレベルを追加することです。

interface ISalesContext
{
    IDbSet<T> GetIDbSet<T>();
    void SetModified(object entity)
}

class SalesContext : DbContext, ISalesContext
{
    public IDbSet<T> GetIDbSet<T>()
    {
        return Set<T>();
    }

    public void SetModified(object entity)
    {
        Entry(entity).State = EntityState.Modified;
    }
}

したがって、実装を呼び出す代わりに、 を呼び出すだけSetModifiedです。

于 2011-02-18T00:19:32.507 に答える