Я не могу поверить, что так сложно заставить кого-нибудь показать мне простой рабочий пример. Это заставляет меня думать, что каждый может говорить только так, как будто они знают, как это делать, но на самом деле они этого не делают.
Я сокращаю пост до только того, что я хочу, чтобы этот пример делал. Может быть, этот пост добирался до долгих и испуганных людей.
Чтобы получить эту награду, я ищу РАБОЧИЙ ПРИМЕР, который я могу скопировать в VS 2010 и запустить.
Что должен сделать пример.
- Покажите, какой тип данных должен находиться в моем домене для версии как отметка времени в mssql 2008
- Показать nhibernate автоматически бросает "StaleObjectException"
- Покажите мне рабочие примеры этих 3 сценариев.
Сценарий 1
Пользователь A приходит на сайт и редактирует строку Row1. Пользователь B приходит (обратите внимание, что он может видеть Row1), и нажимает для редактирования Row1, пользователю не разрешается изменять строку до тех пор, пока не будет закончен пользователь A.
Сценарий 2
Пользователь A приходит на сайт и редактирует строку Row1. Пользователь B наступает через 30 минут и нажимает для редактирования строки Row1. Пользователь B должен иметь возможность редактировать эту строку и сохранять ее. Это связано с тем, что Пользователь А занимал слишком много времени, чтобы редактировать строку и потерял право редактировать.
Сценарий 3
Пользователь А возвращается из дома. Он нажимает кнопку строки обновления, и его следует приветствовать с помощью StaleObjectException.
Я использую asp.net mvc и свободно nhibernate. Ищете пример, который нужно сделать в них.
Что я пробовал
Я попытался создать свой собственный, но я не могу заставить его бросать 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);
}
}