Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 模仿或伪造DbEntityEntry或创建新的DbEntityEntry_Entity Framework_Ef Code First - Fatal编程技术网

Entity framework 模仿或伪造DbEntityEntry或创建新的DbEntityEntry

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

继我的另一个问题之后,我有另一个关于先模拟EF代码的问题

我现在有一个更新方法,如下所示:

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
,并将其保留为空。Just
public void SetModified(对象实体){}
var mockContext = new Mock<AppDbContext>();
mockContext.Setup(c => c.MyDbSet).Returns(mockMyDbSet.Object);
mockContext.Setup(c => c.SetModified(It.IsAny<GuidEntityBase>()));