Entity framework 模仿或伪造DbEntityEntry或创建新的DbEntityEntry
继我的另一个问题之后,我有另一个关于先模拟EF代码的问题 我现在有一个更新方法,如下所示:Entity framework 模仿或伪造DbEntityEntry或创建新的DbEntityEntry,entity-framework,ef-code-first,Entity Framework,Ef Code First,继我的另一个问题之后,我有另一个关于先模拟EF代码的问题 我现在有一个更新方法,如下所示: if (entity == null) throw new ArgumentNullException("entity"); Context.GetIDbSet<T>().Attach(entity); Context.Entry(entity).State = EntityState.Modified; Context.CommitChanges(); return entity
if (entity == null)
throw new ArgumentNullException("entity");
Context.GetIDbSet<T>().Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
Context.CommitChanges();
return entity;
if(实体==null)
抛出新的ArgumentNullException(“实体”);
Context.GetIDbSet().Attach(实体);
Context.Entry(entity.State=EntityState.Modified;
Context.CommitChanges();
返回实体;
Context是我自己的DbContext的接口
我遇到的问题是,我如何处理
Context.Entry(实体).State
我已经完成了这段代码,当我有一个真正的实时DbContext作为我的上下文接口的实现时,它就可以工作了。但是当我把我的假上下文放在那里时,我不知道如何处理它
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;
}
}
接口ISalesContext
{
IDbSet GetIDbSet();
void SetModified(对象实体)
}
类SalesContext:DbContext、IsalContext
{
公共IDbSet GetIDbSet()
{
返回集();
}
公共void SetModified(对象实体)
{
条目(实体).State=EntityState.Modified;
}
}
因此,不用调用实现,只需调用
SetModified
当我需要使用Moq
进行单元测试时发现了这个问题,不需要您自己的接口。我想将特定字段设置为not modified,但方法SetModified
也可以用于object
DbContext:
public class AppDbContext : DbContext
{
...
public virtual void SetModified(GuidEntityBase entity)
{
Entry(entity).State = EntityState.Modified;
Entry(entity).Property(x => x.CreatedDate).IsModified = false;
Entry(entity).Property(x => x.CreatedBy).IsModified = false;
}
...
}
测试:
var mockContext=new Mock();
Setup(c=>c.MyDbSet).Returns(mockMyDbSet.Object);
mockContext.Setup(c=>c.SetModified(It.IsAny());
谢谢。。。我一直在想“我该如何模拟条目”当我不需要时,我只需要模拟修改后的功能。。。我几乎感到尴尬,这一点现在已经很明显了。不要这样——我们作为开发人员的生活充满了“duh!”的时刻:-)-9000我刚刚花了一个小时研究如何用内部构造函数和内部类来模拟类。我每次都被挫败了,解决办法很简单!多亏了询问者和answerer@DiegoMijelshon这是优雅的@ErwinRooijakkers反应迟钝,但在你的测试中,你什么都没做。只需在您的ISalesContext
中实现SetModified
,并将其保留为空。Justpublic void SetModified(对象实体){}
var mockContext = new Mock<AppDbContext>();
mockContext.Setup(c => c.MyDbSet).Returns(mockMyDbSet.Object);
mockContext.Setup(c => c.SetModified(It.IsAny<GuidEntityBase>()));