在SignalR上的集线器内使用事务是否正确

时间:2015-07-15 06:09:59

标签: c# asp.net-mvc entity-framework transactions signalr

我正在学习SignalR,我对它有些怀疑。

首先:Hub是否作为静态对象工作?这个问题转移到下一个问题。

第二:在集线器内的方法内启动事务是对的吗?

我想使用SignalR实时发送和保存信息。例如,我想创建一个聊天,当服务器收到消息时,它会保存在数据库中。

我的问题是接收消息的方法将永远存在于内存中(当webapp正在运行时)。

我关心的是交易/连接。交易是否始终有效?

例如:

public void Send(string name, string message)
        {
             Message m = new Message() { n = name, m = message};
             using(Entities db = new Entities()
             {
                 db.Messages.Add(m);
                 db.Save();
             } 
            // Call the addNewMessageToPage method to update clients.
            Clients.All.addNewMessageToPage(name, message);
        }

我正在使用EntityFramework 6和SignalR 2。

1 个答案:

答案 0 :(得分:1)

为每个请求创建Hub实例。您可以阅读有关中心实例生存期here的更多信息。 EF每次需要保存更改时都会创建一个事务。但是,一旦保存更改完成且事务不会在SaveChanges调用之外泄漏,则EF创建的事务将被提交/回滚并处理。您还处理您的上下文(这是好的),因此您不会泄漏事务或连接。 (实际上,在您的情况下,实际上并不是集线器实例生命周期是相关的,因为您不会尝试在类变量中存储任何内容)。