假设我有一个DbContextFactory,我在存储库中使用它来获取DbContext (我不确定这是最好的解决方案)。
public class DbContextFactory : Disposable, IDbContextFactory
{
private readonly Dictionary<Type, System.Data.Entity.DbContext> _dbContexts;
public DbContextFactory()
{
_dbContexts = new Dictionary<Type, System.Data.Entity.DbContext>();
}
public T GetDbContext<T>() where T : System.Data.Entity.DbContext, new()
{
if (!_dbContexts.ContainsKey(typeof(T)))
{
_dbContexts.Add(typeof(T), new T());
}
return _dbContexts[typeof(T)] as T;
}
protected override void DisposeCore()
{
foreach (var kvpDbContext in _dbContexts)
{
kvpDbContext.Value?.Dispose();
}
}
}我有UnitOfWork,我把它注入BusinessLogic类
public class UnitOfWork<T> : IUnitOfWork
where T : System.Data.Entity.DbContext, new()
{
private readonly IDbContextFactory _dbContextFactory;
private T _dbContext;
public UnitOfWork(IDbContextFactory dbContextFactory)
{
_dbContextFactory = dbContextFactory;
}
public T DbContext => _dbContext ?? (_dbContext = _dbContextFactory.GetDbContext<T>());
public void Commit()
{
DbContext.SaveChanges();
}
}而不是调用存储库方法,假设它抛出了一个异常:
public void CreateUser(User user)
{
_userRepository.Add(user);
throw new Exception();
UnitOfWork.Commit();
}如果我在同一个请求中调用其他存储库方法(或者只是不使用工厂作为每个请求的实例),该方法就会成功结束,而UnitOfWork.Commit()将被调用,这是否意味着CreateUser方法中所做的失败更改也将被保存?或者在抛出异常之后,连接关闭并且没有风险,将保存来自该方法的更改?
为了更清楚地说明:我想在WCF服务中托管它,比如说在单例模式下。然后-一个包含多个(例如5)存储库调用的请求调用方法,前三个将成功,第四个将失败,这意味着我不会在那里调用UnitOfWork.Commit()。然后其他的请求来了,这只是成功。这是否意味着将保存从前三个存储库调用到以前方法的更改?因为单身-仍然会有相同的DbContextFactory和相同的DbContext.
发布于 2017-10-28 11:36:17
正如@Igor在评论中所说的那样,不管您是否处理了该异常,都会产生不同的效果,但是由于您的场景涉及对同一个请求调用anothet存储库,我将假设您确实处理了它。
正如您所说的,您将重用您的DbContextFactory的同一个实例,也就是保存您的DbContext实例的人,可以肯定地说,除非您在其他地方处理了该工厂,否则您的上下文中仍然会添加相同的用户实例,因此在anothet存储库上调用同一个上下文时仍然会插入所述用户。
https://stackoverflow.com/questions/46989027
复制相似问题