Note that there are some explanatory texts on larger screens.

plurals
  1. POversion concurrency control for a long session. NHibernate. ASP.NET MVC
    primarykey
    data
    text
    <p>1) What is more appropriate/commonly used approach for concurrency control? Pessimistic or optimistic locking?</p> <p>2) How do I notify a user if there's a lock on an item or whether rollback had occured?</p> <p>3) Suppose I've added all needed markup (like <code>optimistic-locking="false"</code> to exclude properties I don't want to be involved in comparing) to my entity <em>mapping files</em> and defined a <code>Version</code> property on <em>entity classes</em> to handle concurrency control. Would that be enough and all stuff is processed within/by <code>NHibernate</code>. Or additional modifiactions should be present? For example in <code>Repository</code>?</p> <pre><code>public class Repository&lt;T&gt; : IRepository&lt;T&gt; where T : AbstractEntity&lt;T&gt;, IAggregateRoot { private ISession session; public Repository(ISession session) { this.session = session; } public T Get(Guid id) { return this.session.Get&lt;T&gt;(id); } public IQueryable&lt;T&gt; Get(Expression&lt;Func&lt;T, Boolean&gt;&gt; predicate) { return this.session.Query&lt;T&gt;().Where(predicate); } public IQueryable&lt;T&gt; Get() { return this.session.Query&lt;T&gt;(); } public T Load(Guid id) { return this.session.Load&lt;T&gt;(id); } public void Add(T entity) { using(var transaction = this.session.BeginTransaction()) { this.session.Save(entity); transaction.Commit(); } } public void Remove(T entity) { using(var transaction = this.session.BeginTransaction()) { this.session.Delete(entity); transaction.Commit(); } } public void Remove(Guid id) { using(var transaction = this.session.BeginTransaction()) { this.session.Delete(this.session.Load&lt;T&gt;(id)); transaction.Commit(); } } public void Update(T entity) { using(var transaction = this.session.BeginTransaction()) { this.session.Update(entity); transaction.Commit(); } } public void Update(Guid id) { using(var transaction = this.session.BeginTransaction()) { this.session.Update(this.session.Load&lt;T&gt;(id)); transaction.Commit(); } } } // DI public class DataAccessModule : Ninject.Modules.NinjectModule { public override void Load() { this.Bind&lt;ISessionFactory&gt;() .ToMethod(c =&gt; new Configuration().Configure().BuildSessionFactory()) .InSingletonScope(); this.Bind&lt;ISession&gt;() .ToMethod(ctx =&gt; ctx.Kernel.TryGet&lt;ISessionFactory&gt;().OpenSession()) .InRequestScope(); this.Bind(typeof(IRepository&lt;&gt;)).To(typeof(Repository&lt;&gt;)); } } </code></pre> <p>I'm using a long session with multiple transactions. </p> <p>Thanks!</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload