誰かに簡単な実例を見せてもらうのがとても難しいとは信じられません。誰もがやり方を知っているかのようにしか話せず、実際にはそうではないと私は信じています。
投稿を短くして、例でやりたいことだけにします。たぶん、投稿は長くて怖がっている人々に遠ざかっていました。
この報奨金を得るために、VS 2010 でコピーして実行できる実例を探しています。
例が行う必要があること。
- mssql 2008のタイムスタンプとして、バージョンのドメインで必要なデータ型を表示します
- 「StaleObjectException」を自動的にスローする nhibernate を表示
- これら 3 つのシナリオの実例を示してください
シナリオ 1
ユーザー A がサイトにアクセスし、Row1 を編集します。ユーザー B が来て (Row1 が表示されることに注意してください)、クリックして Row1 を編集します。UserB は、ユーザー A が終了するまで行の編集を拒否する必要があります。
シナリオ 2
ユーザー A がサイトにアクセスし、Row1 を編集します。ユーザー B は 30 分後に来て、クリックして Row1 を編集します。ユーザー B は、この行を編集して保存できる必要があります。これは、ユーザー A が行の編集に時間がかかりすぎて、編集する権利を失ったためです。
シナリオ 3
ユーザー A が不在から戻ってきました。行の更新ボタンをクリックすると、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);
}
}