Лучший подход к созданию NHibernate DTO

Я новичок в NHibernate (и ORMS) и пытаюсь справиться с множеством различных вариантов, которые он предлагает. Для справки я использую Fluent NHibernate с отдельными бизнес-объектами, которые в свою очередь используют DTO исключительно для доступа к данным. Моя архитектура приложения должна поддерживать как Windows, так и веб-интерфейсы.

Мой вопрос - один из общих подходов, так как кажется, что вариантов так много. Мой DTO выглядит примерно так, как показано ниже. Каждый DTO имеет ссылку на ISession, которая передается им из BO. Они несут ответственность за собственную загрузку и сохраняют:

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 иметь возможность сохранять и загружать себя?

Во-вторых: Независимо от того, где находится код сохранения / загрузки, следует ли вам использовать одну и ту же сессию IS для жизненного цикла или объекта, или они должны иметь ссылку на 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, ничего из вышеперечисленного :)

Ответы на вопрос(4)

Ваш ответ на вопрос