C# 保存更改在封装的UnitOFWork类中不起作用
您好,我正在尝试首先使用实体框架代码创建一个通用存储库,并将所有内容封装在UnitOfWork中,但一定是出了问题,因为当我尝试添加它并使用封装的SaveChanges时,它不起作用。 以下是我的存储库代码: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>
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()); }
}