我正在使用 单层 、 单用户 应用程序,以及 FluentNHibernate 。具有多线程,由时间触发器和传入套接字消息触发器触发。
什么要求将决定我是否可以在存储库的每个方法中创建/处理 ISession ,或者我是否需要在多个调用中维护 ISession 生命周期,也许从程序开始到结束?
例如, 延迟加载 是否需要维护 session ?如果我不使用lazyload,还有什么其他原因我应该维护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();
}
EDIT1:
尝试处理“每次通话的 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/