2012-02-21 20 views
1

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メソッドを使用しようデータベースプロバイダによって例外がスローされます。

NHibernate.Exceptions.GenericADOException:01を取得できませんでしたバージョン:[NHLockTest.ChildOneは#1] [SQL:?ID = "AbstractBaseClass" からバージョンを選択]:SQLiteのエラーがないような列: AbstractBaseClass_id

----> System.Data.SQLite.SQLiteException

は、ここで私は簡単な例では、問題を再作成するために使用したユニットテストです:

[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にバグを見つけましたか?

答えて

0

流暢でないNHibernateでは、XMLマッピングで:polymorphism = "explicit"を設定する必要があります。

流暢NHibernateはの古いバージョンで動作しないようです。

fluent nhibernate convention : setting polymorphism mode

あなたは(私はそれをテストしていない)のような何かを試すことができます。

fluentConfiguration.Mappings(map => map.AutoMappings.Add(
      AutoMap.AssemblyOf<AbstractBaseClass>() 
       .Where(x => x.IsSubclassOf(typeof(Entity))) 
       .IncludeBase<AbstractBaseClass>() 
       .Polymorphism.Explicit() 
       .Conventions.Add(DefaultCascade.All()))); 
+0

残念ながら、これはいないようでしたうまくいけば - 私はまだhbmマッピングファイルで問題を作り直すことができたので、NHibernateプロジェクトで問題が発生しました。 問題は、LockMode.Forceを使用して生成されたSession.LockとUPDATEステートメントの使用にのみ焦点を当てているようです。さもなければ、バージョン管理は正常に動作しているようです – lowds

関連する問題