紧接着我的另一个question about mocking 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;

上下文是我自己的DbContext的接口(interface)。

我遇到的问题是,我该如何处理
Context.Entry(entity).State

我已经逐步完成了这段代码,当我有一个实时的DbContext作为Context接口(interface)的实现时,它就可以工作。但是,当我将虚假上下文放在那里时,我不知道该如何处理。

没有DbEntityEntry类的构造函数,因此我不能只在假上下文中创建一个新的构造函数。

在您的CodeFirst解决方案中模拟或伪造DbEntityEntry方面是否有人成功?

还是有更好的方法来处理状态更改?

最佳答案

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

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即可。

关于entity-framework - 模拟或伪造DbEntityEntry或创建新的DbEntityEntry,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5035323/

10-12 21:56