2012-10-12 59 views
3

什麼會導致更改不生成更新語句的現有實體?我有一個更新實體狀態枚舉的命令。它將其從「活動」更改爲「已刪除」。我使用相同的命令(通常)來更新其他實體上的狀態位,沒有問題。我可以更新有關實體的單個字符串而不更改其他任何內容,並且更新過程正常。我可以看到這一切會倒在NHProf ...NHibernate實體未更新

我想我的問題,然後是:

  • 什麼會導致NHibernate的不更新實體時枚舉值(和其它...或其他的東西?)被改變了?
  • 追蹤這些問題的最佳方式是什麼?

感謝您的幫助!

一條線索。基類型的屬性是:

public virtual EntityStatus Status { get; protected set; } 

如果我做的setter公開和直接分配給它,NHibernate的撿起來就好了。當它受到保護時,我會在實體上調用一個方法並更新其中的狀態。這是否提供了任何線索?

回答

2

所以,這是一個有趣的和屁股追蹤的全部痛苦。事實證明,使用任何映射內部的Lazy加載以某種方式將ol'加入到某處。因此,調用虛方法來更新受保護的財產,當我做這不起作用:

Any(o => o.Thing, typeof(Guid), m => 
         { 
          m.IdType<Guid>(); 
          m.MetaType<string>(); 
          m.MetaValue("Squirmy", typeof(SquirmyThing)); 
          m.MetaValue("Odoriferous", typeof(OdoriferousThing)); 
          m.Columns(id => id.Name("ThingId"), cr => cr.Name("ThingType")); 
          m.Lazy(true); 
          m.Cascade(Cascade.Persist); 
         }); 

但它確實工作時,我這樣做:

Any(o => o.Thing, typeof(Guid), m => 
         { 
          m.IdType<Guid>(); 
          m.MetaType<string>(); 
          m.MetaValue("Squirmy", typeof(SquirmyThing)); 
          m.MetaValue("Odoriferous", typeof(OdoriferousThing)); 
          m.Columns(id => id.Name("ThingId"), cr => cr.Name("ThingType")); 
          m.Lazy(false); 
          m.Cascade(Cascade.Persist); 
         }); 

不管怎樣,我真的希望這可以幫助別人足夠瘋狂使用任何映射。

0

如果您正在更新的實體不在會話對象中,則可能發生這種情況。確保您沒有關閉您查詢原始對象或將其附加到的會話。

此外,請確保您實際上將價值改變爲與以前不同的價值。如果您已爲此實體啓用dynamic-update,並且實際上並未更改該值,則不會生成更新。

動態更新(可選,默認爲false):指定用於UPDATE SQL將會在運行時產生並且只包含那些改變過的那些列 。

我會啓用NHibernate的日誌記錄也看看它吐出什麼,你可能會發現日誌中的一些有用的信息。

老實說,我也會在你的問題中發佈有問題的代碼。通過查看代碼可以很容易地知道事情可能出錯的地方。

+0

有趣的是,在這種情況下,我不確定它會更容易。我已經完成了上百次,而且這些懶散的映射與其他使用完全相同的泛型命令來更新存在於它們都繼承的抽象類上的屬性的實體幾乎完全相同。代碼全部通過完全相同的命令處理程序,使用完全相同的會話/事務管理以及除一個實體類型外的所有工作。這是奇怪的! – Jereme

+0

另一個線索:基本類型的屬性是公共虛擬EntityStatus Status {get;保護組; }如果我將setter公開並直接分配給它,NHibernate就可以很好地完成它。當它受到保護時,我會在實體上調用一個方法並更新其中的狀態。這是否提供了任何線索? – Jereme

相關問題