Como você faz o versionamento no Nhibernate?

Eu não posso acreditar que é tão difícil conseguir alguém para me mostrar um exemplo simples de trabalho. Isso me leva a acreditar que todos podem falar como sabem, mas na realidade não sabem.

Eu encurtei o post para apenas o que eu quero que o exemplo faça. Talvez o post estivesse ficando longe e assustando as pessoas.

Para obter essa recompensa, estou procurando um EXEMPLO DE TRABALHO que eu possa copiar no VS 2010 e executar.

O que o exemplo precisa fazer.

Mostrar qual tipo de dados deve estar no meu domínio para a versão comotimestamp em mssql 2008Mostrar nhibernate jogando automaticamente o "StaleObjectException"Mostre-me exemplos de trabalho desses três cenários

Cenário 1

O usuário A chega ao site e edita Row1. O usuário B vem (note que ele pode ver a Linha 1) e clica para editar a Linha1, o Usuário B deve ser impedido de editar a linha até que o Usuário A seja concluído.

Cenário 2

O usuário A chega ao site e edita Row1. O usuário B chega 30 minutos depois e clica para editar a Linha1. O usuário B deve poder editar essa linha e salvar. Isso ocorre porque o usuário A demorou muito para editar a linha e perdeu seu direito de edição.

Cenário 3

O usuário A volta de estar ausente. Ele clica no botão de linha de atualização e ele deve ser saudado com StaleObjectException.

Eu estou usando o asp.net mvc e nhibernate fluente. Olhando para o exemplo a ser feito nestes.

O que eu tentei

Eu tentei construir o meu próprio, mas não posso obtê-lo jogar o StaleObjectException nem posso obter o número da versão para incrementar. Eu me cansei de abrir dois navegadores separados e carreguei a página de índice. Ambos os navegadores mostraram o mesmo número de versão.

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);
    }
}

questionAnswers(7)

yourAnswerToTheQuestion