模拟或伪造DbEntityEntry或创建新的DbEntityEntry

tay*_*onr 60 entity-framework ef-code-first

紧接着我关于嘲笑DbContext的另一个问题.我还有另外一个关于模拟 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;
Run Code Online (Sandbox Code Playgroud)

Context是我自己的DbContext的接口.

我遇到的问题是,我该如何处理

Context.Entry(entity).State.

我已经介绍了这段代码,当我有一个真实的DbContext作为我的Context接口的实现时,它就可以工作了.但是当我把假的上下文放在那里时,我不知道如何处理它.

DbEntityEntry类没有构造函数,所以我不能在我的伪上下文中创建一个新构造函数.

有没有人在CodeFirst解决方案中嘲弄或伪造DbEntityEntry有什么成功?

或者有更好的方法来处理状态变化吗?

Die*_*hon 94

就像其他情况一样,您需要的是添加额外的间接级别:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您只需致电,而不是调用实现SetModified.

  • 不要 - 我们的生活开发人员充满了"呃!" 时刻:-) (10认同)
  • +9000我花了一个小时研究如何用内部ctors和内部类来模拟类.我在每一个转折点都被挫败了,解决方案就这么简单!感谢提问者和回答者 (4认同)