C# UnitOfWork正在与多个同时连接进行斗争

C# UnitOfWork正在与多个同时连接进行斗争,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,显然(而且很可能)我当前的UnitOfWork实现中存在一个缺陷,因为我在一次执行多个调用时会出现连接错误 例外情况: 基础提供程序在打开时失败 内部异常: 连接没有关闭。连接的当前状态为 连接 这会在客户端产生HTTP 500响应 工作单元实施 public class ScopedUnitOfWork : IUnitOfWork { public Entities Context { get; set; } public UnitOfWorkState State { get

显然(而且很可能)我当前的UnitOfWork实现中存在一个缺陷,因为我在一次执行多个调用时会出现连接错误

例外情况:

基础提供程序在打开时失败

内部异常:

连接没有关闭。连接的当前状态为 连接

这会在客户端产生HTTP 500响应

工作单元实施

public class ScopedUnitOfWork : IUnitOfWork
{
    public Entities Context { get; set; }
    public UnitOfWorkState State { get; set; }

    public ScopedUnitOfWork(IEnvironmentInformationProvider environmentInformationProvider)
    {
        this.Context = new Entities(environmentInformationProvider.ConnectionString);
        this.State = UnitOfWorkState.Initialized;
    }

    public UowScope GetScope()
    {
        this.State = UnitOfWorkState.Working;

        return new UowScope(this);
    }

    public SaveResult Save()
    {
        if (this.State != UnitOfWorkState.Working)
            throw new InvalidOperationException("Not allowed to save out of Scope. Request an UowScope instance by calling method GetScope().");

        this.Context.SaveChanges();

        this.State = UnitOfWorkState.Finished;

        return new SaveResult(ResultCodes.Ok);
    }
}
在一个
UowScope
上工作可以解决这个问题,但鉴于目前的情况,这是不可能的,因为每个请求都是完全独立的。事实上,每个请求都使用一个
UoWScope
,但是当UoW一次收到多个调用时,显然会出错

UoW是通过Unity IoC注入的,所以我认为它实际上是一个单体

问题

public class ScopedUnitOfWork : IUnitOfWork
{
    public Entities Context { get; set; }
    public UnitOfWorkState State { get; set; }

    public ScopedUnitOfWork(IEnvironmentInformationProvider environmentInformationProvider)
    {
        this.Context = new Entities(environmentInformationProvider.ConnectionString);
        this.State = UnitOfWorkState.Initialized;
    }

    public UowScope GetScope()
    {
        this.State = UnitOfWorkState.Working;

        return new UowScope(this);
    }

    public SaveResult Save()
    {
        if (this.State != UnitOfWorkState.Working)
            throw new InvalidOperationException("Not allowed to save out of Scope. Request an UowScope instance by calling method GetScope().");

        this.Context.SaveChanges();

        this.State = UnitOfWorkState.Finished;

        return new SaveResult(ResultCodes.Ok);
    }
}
是否有办法调整UoW,使单独的高频请求不成问题

最好我解决这个服务器端,而不是客户端,有什么提示吗?谢谢

免责声明

我并不是说我完全理解UoW,所以我的实现可能需要改进,请温和:)。当然欢迎在这方面做出任何改进

更新


我知道EF上下文是UoW,我在域级别使用我的上下文来支持与功能相关的数据事务处理。这也是由客户需求决定的,我别无选择。

您面临的问题是,工作单元对象实际上是一个单独的对象,因为您的IoC框架在应用程序期间一直保持着它。这意味着您的上下文在UoW中也作为一个单例保存。因此,您几乎肯定会得到多个对上下文的并发调用,这些调用将抛出异常


然而,我认为你误用了UoW应该做什么的概念。UoW用于为一组事务提供容器。例如,假设您有一个电子商务平台。创建订单时,您将在orders表中插入一行,然后作为同一事务的一部分,您还将在order items表中插入行,更新用户忠诚度点数等。因此,您应该在单个工作单元内完成所有这些操作,提交,然后销毁它。让IoC框架(在本例中为Unity)为每个会议创建您的工作单元。

。这里是UOW反模式,回应spender所说的。。。一般来说,您真正需要的是围绕每个工作单元使用(DBContext ctx=new DBContext())语句,可能还需要手动使用ctx.Connection.Open()和ctx.Connection.Close()。@spike这应该会让您非常感兴趣。。。你是说UoW是一个单例,这实际上使上下文也是一个单例?这绝对行不通。请阅读Chris Pratt的答案,阅读Phil Soady的答案,这更接近要点(实际上很有用),谢谢!