c# - NHibernate ISession 生命周期;什么时候可以在每个存储库方法中创建/处置?

标签 c# .net database nhibernate repository

我正在使用 单层单用户 应用程序和 FluentNHibernate。具有多个线程,由时间触发器和传入套接字消息触发器触发。

哪些要求将决定我是否可以在存储库的每个方法中创建/处理 ISession,或者我是否需要在多个调用中维护 ISession 生命周期,也许从程序开始到结束?

例如,lazy-load 是否需要保持 session ?如果我不使用延迟加载,还有什么其他原因应该维护 ISession?

目前我的存储库方法如下所示,但我想知道我是否做错了..

public class ProductRepository
{
    public void Delete(Product product)
    {
        using (ISession session = FNH_Manager.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Delete(product);
                transaction.Commit();
            }
        }
    }

class FNH_Manager
{
    private static Configuration cfg;
    private static ISessionFactory sessionFactory;

    public static void ConfigureSessionFactory()
    {
        sessionFactory = CreateSessionFactory();
    }

    public static ISession OpenSession()
    {
        return sessionFactory.OpenSession();
    }

编辑 1: 尝试处理“每次通话的 session ”:

   public class EmployeeRepository
   {  
        public static void Delete(Employee employee)
        {
            using (ISession session = FNH_Manager.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    if (Employee.Id != 0)
                    {
                      var emp =  session.Get(typeof(Employee), employee.Id);
                      if (emp != null)
                      {
                        session.Delete(emp);
                        transaction.Commit();
                      }
                    }
                }
            }
        } 

最佳答案

当您引用延迟加载的字段时, session 必须打开,因此如果您依赖于存储库外部的延迟加载,则需要在更高的地方管理 session 生命周期。

如果您不使用延迟加载,还有一个问题是您是否需要在一个事务中支持多个操作。例如,如果您一次删除一个产品和一些其他数据,您希望在同一 session 的一个事务中发生这种情况(否则您可能会删除该产品,让一些代码抛出一些异常,并且永远不会删除另一个数据,最终可能会在您的数据库中出现孤立记录或损坏状态)。

关于c# - NHibernate ISession 生命周期;什么时候可以在每个存储库方法中创建/处置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868301/

相关文章:

.net - 如何修复 "the type or namespace name "系统“无法找到您是否缺少指令或程序集引用 (CS0246)”

c# - 项目开发过程中从VS2010升级到VS2012有风险吗?

mysql - 显示 "users"表中的所有用户名

c# - 如何在不缩放主摄像头的情况下为移动设备创建可缩放的 Canvas 图像?

c# - 你能为一个类使用类似数组的构造函数吗

.net - 这个匿名类型具体类型是什么?

mongodb - 在查询中可以传递给 MongoDB '$in' 运算符的数组元素的数量有什么限制?

c# - NOSQL数据库选型论坛

c# - 命令已在进行中

c# - 格式 "12345678"到 "1234-5678"