首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DbContext处理,dbcontext工厂,工作单元

DbContext处理,dbcontext工厂,工作单元
EN

Stack Overflow用户
提问于 2017-10-28 11:07:59
回答 1查看 1.4K关注 0票数 1

假设我有一个DbContextFactory,我在存储库中使用它来获取DbContext (我不确定这是最好的解决方案)。

代码语言:javascript
复制
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类

代码语言:javascript
复制
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();
    }
}

而不是调用存储库方法,假设它抛出了一个异常:

代码语言:javascript
复制
    public void CreateUser(User user)
    {
        _userRepository.Add(user);

        throw new Exception();

        UnitOfWork.Commit();
    }

如果我在同一个请求中调用其他存储库方法(或者只是不使用工厂作为每个请求的实例),该方法就会成功结束,而UnitOfWork.Commit()将被调用,这是否意味着CreateUser方法中所做的失败更改也将被保存?或者在抛出异常之后,连接关闭并且没有风险,将保存来自该方法的更改?

为了更清楚地说明:我想在WCF服务中托管它,比如说在单例模式下。然后-一个包含多个(例如5)存储库调用的请求调用方法,前三个将成功,第四个将失败,这意味着我不会在那里调用UnitOfWork.Commit()。然后其他的请求来了,这只是成功。这是否意味着将保存从前三个存储库调用到以前方法的更改?因为单身-仍然会有相同的DbContextFactory和相同的DbContext.

EN

回答 1

Stack Overflow用户

发布于 2017-10-28 11:36:17

正如@Igor在评论中所说的那样,不管您是否处理了该异常,都会产生不同的效果,但是由于您的场景涉及对同一个请求调用anothet存储库,我将假设您确实处理了它。

正如您所说的,您将重用您的DbContextFactory的同一个实例,也就是保存您的DbContext实例的人,可以肯定地说,除非您在其他地方处理了该工厂,否则您的上下文中仍然会添加相同的用户实例,因此在anothet存储库上调用同一个上下文时仍然会插入所述用户。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46989027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档