Как вы делаете управление версиями в Nhibernate?

Я не могу поверить, что так сложно заставить кого-то показать мне простой рабочий пример. Это заставляет меня верить, что все могут говорить только так, как они знают, как это сделать, но на самом деле они этого не делают.

Я сокращаю пост до того, что хочу сделать в примере. Возможно, пост становился длинным и напуганным.

Чтобы получить эту награду, я ищу РАБОЧИЙ ПРИМЕР, который я могу скопировать в VS 2010 и запустить.

Что должен сделать пример.

Show what datatype should be in my domain for version as a timestamp in mssql 2008 Show nhibernate automatically throwing the "StaleObjectException" Show me working examples of these 3 scenarios

Scenario 1

Пользователь A заходит на сайт и редактирует Row1. Приходит пользователь B (обратите внимание, что он может видеть Row1) и щелкает, чтобы редактировать Row1, пользователю B следует запретить редактирование строки, пока пользователь A не завершит работу.

Scenario 2

Пользователь A заходит на сайт и редактирует Row1. Пользователь B приходит через 30 минут и щелкает, чтобы редактировать Row1. Пользователь B должен иметь возможность редактировать эту строку и сохранить. Это связано с тем, что пользователю A потребовалось слишком много времени, чтобы отредактировать строку, и он потерял право на редактирование.

Scenario 3

Пользователь А возвращается из отсутствия. Он нажимает кнопку обновления строки, и его следует приветствовать с помощью StaleObjectException.

Я использую asp.net MVC и свободно nhibernate. Ищите пример, который будет сделан в этих.

What I tried

Я пытался создать свой собственный, но я не могу его получить, выбрасываю исключение StaleObjectException и не могу получить номер версии для увеличения. Я устал открывать 2 отдельных браузера и загружал страницу индекса. Оба браузера показали одинаковый номер версии.

public class Default1Controller : Controller
{
    //
    // GET: /Default1/

    public ActionResult Index()
    {
        var sessionFactory = CreateSessionFactory();

        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var firstRecord = session.Query<TableA>().FirstOrDefault();
                transaction.Commit();
                return View(firstRecord);
            }

        }

    }

    public ActionResult Save()
    {
        var sessionFactory = CreateSessionFactory();
        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var firstRecord = session.Query<TableA>().FirstOrDefault();
                firstRecord.Name = "test2";
                transaction.Commit();
                return View();
            }
        }
    }

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(c => c.FromConnectionStringWithKey("Test")))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TableA>())
                             //  .ExposeConfiguration(BuidSchema)
            .BuildSessionFactory(); 
    }


    private static void BuidSchema(NHibernate.Cfg.Configuration config)
    {
        new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
    }

}


public class TableA
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    // Not sure what data type this should be for timestamp.
    // To eliminate changing to much started with int version
    // but want in the end timestamp.
    public virtual int Version { get; set; } 
}

public class TableAMapping : ClassMap<TableA>
{
    public TableAMapping()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Version(x => x.Version);
    }
}

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

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