C# 保存更改在封装的UnitOFWork类中不起作用

C# 保存更改在封装的UnitOFWork类中不起作用,c#,entity-framework,C#,Entity Framework,您好,我正在尝试首先使用实体框架代码创建一个通用存储库,并将所有内容封装在UnitOfWork中,但一定是出了问题,因为当我尝试添加它并使用封装的SaveChanges时,它不起作用。 以下是我的存储库代码: public class Repository<T> : IRepository<T> where T : class { private DbContext Context { get; set; } private DbSet<T>

您好,我正在尝试首先使用实体框架代码创建一个通用存储库,并将所有内容封装在UnitOfWork中,但一定是出了问题,因为当我尝试添加它并使用封装的SaveChanges时,它不起作用。 以下是我的存储库代码:

public class Repository<T> : IRepository<T> where T : class
{
    private DbContext Context { get; set; }
    private DbSet<T> DbSet
    {
        get { return Context.Set<T>(); }
    }

    public Repository(DbContext context)
    {
        Context = context;
    } 

    public virtual IEnumerable<T> GetAll()
    {
        return DbSet;
    }

    public virtual T GetById(int id)
    {
        return DbSet.Find(id);
    }

    public virtual void Add(T entity)
    {
        DbEntityEntry dbEntityEntry = Context.Entry(entity);
        if (dbEntityEntry.State != EntityState.Detached)
        {
            dbEntityEntry.State = EntityState.Added;
        }
        else
        {

            DbSet.Add(entity);
        }
    }

    public virtual void Update(T entity)
    {
        DbEntityEntry dbEntityEntry = Context.Entry(entity);
        if (dbEntityEntry.State == EntityState.Detached)
        {
            DbSet.Attach(entity);
        }
        DbSet.Attach(entity);
    }

    public virtual void Remove(T entity)
    {
        DbEntityEntry dbEntityEntry = Context.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);   
        }
    }

    public virtual void Remove(int id)
    {
        var entity = GetById(id);
        if (entity == null)
        {
            return;
        }
        Remove(entity);
    }
}
运行此代码后,由于某种原因,UnitOfWork类中封装的SaveChanges似乎无法工作

但如果我在DbSet.add(entity)之后添加这一行

似乎对象get已添加到数据库中


如何使UnitOfWork SaveChanges方法工作?

代码中的问题如下:

private DatabaseContext DbContext
{
    get { return new DatabaseContext(); }
}
有效的做法是在每次访问您的属性时创建一个新的上下文。当您的
存储库
正确保存一个上下文并重新使用同一个上下文时,当您调用
UnitOfWork.SaveChanges
时,您保存的是新创建的上下文,没有任何更改

本着UnitOfWork的精神,您希望您的上下文在封闭类的整个生命周期中都存在(
UnitOfWork
)。试试这个:

private DatabaseContext dbContext;
private DatabaseContext DbContext
{
    get { return dbContext ?? (dbContext = new DatabaseContext()); }
}

这样,在第一次访问
DbContext
属性时,
DatabaseContext
只会在
UnitOfWork
的生命周期中创建一次。

代码中的问题如下:

private DatabaseContext DbContext
{
    get { return new DatabaseContext(); }
}
有效的做法是在每次访问您的属性时创建一个新的上下文。当您的
存储库
正确保存一个上下文并重新使用同一个上下文时,当您调用
UnitOfWork.SaveChanges
时,您保存的是新创建的上下文,没有任何更改

本着UnitOfWork的精神,您希望您的上下文在封闭类的整个生命周期中都存在(
UnitOfWork
)。试试这个:

private DatabaseContext dbContext;
private DatabaseContext DbContext
{
    get { return dbContext ?? (dbContext = new DatabaseContext()); }
}

这样,在第一次访问
DbContext
属性时,您的
DatabaseContext
将在
UnitOfWork
的生命周期中只创建一次。

更好的是,上下文应该可以注入到存储库中。通过这种方式,您可以在同一工作单元的不同存储库中重用相同的上下文。@WiktorZychla该上下文已“注入”到存储库中。它作为构造函数参数传递。除非我错过了阅读他的代码。没错,我一定错过了。更好的是,上下文应该可以注入到存储库中。通过这种方式,您可以在同一工作单元的不同存储库中重用相同的上下文。@WiktorZychla该上下文已“注入”到存储库中。它作为构造函数参数传递。除非我错过了阅读他的代码。没错,我一定错过了。在存储库上实现IDisposable,并重用EF中内置的工作单元怎么样?在存储库上实现IDisposable,并重用EF中内置的工作单元怎么样?
private DatabaseContext dbContext;
private DatabaseContext DbContext
{
    get { return dbContext ?? (dbContext = new DatabaseContext()); }
}