NHibernate(およびFluent NHibernate)を使用して、バージョンプロパティが抽象基本クラスにあるときにsession.Lock機能を使用しようとしています。Versionプロパティで抽象基底クラスSession.Lockと抽象基本クラス
私は、次のドメインモデルまでの例を簡素化することができました:
public abstract class AbstractBaseClass : Entity
{
public virtual int Version { get; protected set; }
public virtual string Name { get; set; }
}
public class ChildOne : AbstractBaseClass
{
public virtual string Address { get; set; }
}
私の流暢な設定は次のとおりです。
fluentConfiguration.Mappings(map => map.AutoMappings.Add(
AutoMap.AssemblyOf<AbstractBaseClass>()
.Where(x => x.IsSubclassOf(typeof(Entity)))
.IncludeBase<AbstractBaseClass>()
.Conventions.Add(DefaultCascade.All())));
私はセッションANにLockメソッドを使用しようデータベースプロバイダによって例外がスローされます。
----> System.Data.SQLite.SQLiteExceptionNHibernate.Exceptions.GenericADOException:01を取得できませんでしたバージョン:[NHLockTest.ChildOneは#1] [SQL:?ID = "AbstractBaseClass" からバージョンを選択]:SQLiteのエラーがないような列: AbstractBaseClass_id
は、ここで私は簡単な例では、問題を再作成するために使用したユニットテストです:
[Test]
public void Should_Lock_Entity()
{
using (var session = _sessionFactory.OpenSession())
{
var entity = new ChildOne {Address = "Some Address", Name = "Some Name"};
session.Save(entity);
session.Flush();
}
using (var session = _sessionFactory.OpenSession())
{
var entity = session.Query<ChildOne>().Single();
//this is where the exception is raised
session.Lock(entity, LockMode.Force);
}
}
私はてSession.lockコールが行われたとき、次の文が生成されている参照のSQLを表示するようにNHibernateのを設定する場合:
UPDATE "AbstractBaseClass"
SET Version = @p0
WHERE AbstractBaseClass_id = @p1 AND Version = @p2;
@p0 = 2 [Type: Int32 (0)], @p1 = 1 [Type: Int64 (0)], @p2 = 1 [Type: Int32 (0)]
基本クラスのテーブルを更新しようとしていますが、基本クラステーブルのIdカラムではなく、子テーブルのforignキーカラム名を使用しているようです。これは明らかに上記の例外メッセージが言っていることと結びついていません。
私はここで何か非常に間違っているか、NHibernateにバグを見つけましたか?
残念ながら、これはいないようでしたうまくいけば - 私はまだhbmマッピングファイルで問題を作り直すことができたので、NHibernateプロジェクトで問題が発生しました。 問題は、LockMode.Forceを使用して生成されたSession.LockとUPDATEステートメントの使用にのみ焦点を当てているようです。さもなければ、バージョン管理は正常に動作しているようです – lowds