我是 NHibernate(和 ORMS)的新手,并试图掌握它提供的无数不同选项。作为参考,我将 Fluent NHibernate 与单独的业务对象一起使用,而这些业务对象又将 DTO 纯粹用于数据访问。我的应用程序架构必须同时支持 Windows 和 Web“前端”。
我的 qudry 是一种通用方法,因为似乎有很多选择。我的 DTO 类似于下面的示例。每个 DTO 都有一个对从 BO 传递给它们的 ISession 的引用。他们负责自己的加载和保存:
public class EmployeeDTO...
// Data Properties to be persisted to the database
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual ISession Session { get; set; }
// Save logic
public virtual void Save()
{
var transaction = Session.BeginTransaction();
Session.SaveOrUpdate(this);
transaction.Commit();
}
// Load logic
public virtual void Load(int id)...
首先: 这是正确的方法吗 - DTO 是否应该具有保存和加载自身的能力?
其次: 无论保存/加载代码在哪里,您应该在生命周期或对象中使用相同的 ISession,还是应该在每次需要数据库交互时对 ISessionFactory 有一个引用并打开一个新会话?
// Open a new session every time I interact with the repository
var session = FluentSupport.SessionFactory.OpenSession();
var transaction = Session.BeginTransaction();
Session.SaveOrUpdate(this);
transaction.Commit();
session.Close();
// Close the session when I'm done
当然总是有选项3,以上都不是:)