2016-06-28 4 views
0

時々、このコードが原因でログ(NHibernate.SQL)に表示されるupdateトランザクションをコミットするときにsqlがエンティティをクエリします。NHibernateがget-onlyトランザクションの更新クエリを送信する

using (ISession session = SessionFactory.OpenSession()) 
{ 
    using (session.BeginTransaction()) 
    { 
     entity = session.Get<E>(id); 
     session.Transaction.Commit(); 
    } 
} 

どうしてですか?

スタックトレース:

at NHibernate.AdoNet.Util.SqlStatementLogger.LogCommand(String message, IDbCommand command, FormatStyle style) in p:\nhibernate-core\src\NHibernate\AdoNet\Util\SqlStatementLogger.cs:line 56 
    at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd) in p:\nhibernate-core\src\NHibernate\AdoNet\AbstractBatcher.cs:line 191 
    at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation) in p:\nhibernate-core\src\NHibernate\AdoNet\NonBatchingBatcher.cs:line 40 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2776 
    at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2702 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2957 
    at NHibernate.Action.EntityUpdateAction.Execute() in p:\nhibernate-core\src\NHibernate\Action\EntityUpdateAction.cs:line 79 
    at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in p:\nhibernate-core\src\NHibernate\Engine\ActionQueue.cs:line 136 
    at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in p:\nhibernate-core\src\NHibernate\Engine\ActionQueue.cs:line 125 
    at NHibernate.Engine.ActionQueue.ExecuteActions() in p:\nhibernate-core\src\NHibernate\Engine\ActionQueue.cs:line 171 
    at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in p:\nhibernate-core\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 241 
    at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in p:\nhibernate-core\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:line 20 
    at NHibernate.Impl.SessionImpl.Flush() in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 1507 
    at NHibernate.Transaction.AdoTransaction.Commit() in p:\nhibernate-core\src\NHibernate\Transaction\AdoTransaction.cs:line 193 

が更新プロパティには、次のようになります。

public virtual MyEnum MyProperty { get; set; } 

integer not nullデータベース列にマップされます。

答えて

0

正しい方法は次のとおりです。

public class EnumConvention : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     instance.CustomType(instance.Property.PropertyType); 
    } 

    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Property != null); 
     criteria.Expect(x => x.Type.IsEnum); 
    } 
} 

これは私の問題を解決しました。

0

これは、あなたがDB

Age [int] NULL -- Nullable column 

を列を持っていますが、マッピングがNULL可能でないと言うことを想像してコミット

  1. ダーティチェックと
  2. フラッシュの結果であり、 :

    とC#のプロパティ0も

    public virtual int Age { get; set; } 
    

    NULL可能でないと、そのようなレコードがnull値がロードされている場合 - エンティティのプロパティをAgeはに設定されています。

    このシナリオでは... NHiberanteは値が変更されたことを知り、FLUSH(コミット)を試行してDBとアプリケーションを整列させようとします。書き込み動作の実行がある理由は...ただの例ですが、ナットシェル、これらのケースですマッピング列挙型の

+0

私は、プロパティが列挙型であり、 'not null'カラムにマップされているという質問に含まれています。 enum-integerの会話はそれを引き起こすことができますか? – Vlad

+0

db値とそのenumのC#値が何であるかを確認 –

+0

db値は1で、C#enum値はそれに対応します。 – Vlad

関連する問題