紧接着我的另一个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/