Как вы делаете управление версиями в 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 scenariosScenario 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);
}
}