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