2010-07-20 83 views
0

在NHibernate的使用期間...實現IPropertyAccessor NHibernate

我遇到的一個奇怪的問題是Session.Flush()命令後的多個更新。沒有數據實際改變...只是想執行選擇所有,在我的情況下有1000個更新 - 每個返回行一個!

只有當我使用具有自定義PropertyAccessor的屬性作爲訪問類型時,纔會發生此類行爲。我創建自定義屬性的原因是因爲我在對象中有uint和ushort類型,所以我想在Setter上將它們從(長或Int32相應地)放入。

問題是如何禁用這些更新或爲什麼我的自定義Setter導致這種行爲?

void Set(object target, object value) 
     { 
      If(Value.GetType() == typeof(long)) 
      { 
      Target.GetType().GetProperty(_propertyName).SetValue((uint)value); 
      } 
     } 

由於提前,

更新:------ 如何禁用每前沖洗這個骯髒的檢查?

回答

2

看起來好像你的PropertyAccessor搞亂了NHibernate會話的髒跟蹤。這post顯示如何可以測試實體是否髒。你應該添加這段代碼並將其調試到NHibernate源代碼中,以確定你的實體爲什麼被認爲是髒的。我懷疑這些類型不匹配。

更新:

另一種方法是,讓您的實體定義爲無符號,但改變分貝映射在數據庫中使用符號類型。這是如何使用Fluent NHIbernate和SQL服務器:

public class TestEntity : Entity 
{ 
    public virtual uint Unsigned { get; set; } 
    public virtual ushort UnsignedShort { get; set; } 
} 

public class TestEntityMap : ClassMap<TestEntity> 
{ 
    public TestEntityMap() 
    { 
     Map(x => x.Unsigned).CustomSqlType("bigint"); 
     Map(x => x.UnsignedShort).CustomSqlType("int"); 
    } 
} 
+0

10x對於類型的好點...可能我會使用session.Evict(obj)選項。 – user3072 2010-07-20 14:57:24

+0

如果您可以考慮在實體和數據庫映射之間使用「匹配」類型。或者使用CustomSqlType在映射層重新映射(例如,請參閱http://stackoverflow.com/questions/644496/fluent-nhibernate-schema-generation) – 2010-07-20 15:19:19

+0

我對NHibernate源代碼進行了一些調試,原因是類型不匹配。就像你假設骯髒的國旗...比較是這樣進行的 return x.Equal(y); 在我的情況下,x很長,y是uint,所以結果總是假的。 至於你的建議,我不喜歡在我的業務邏輯對象中使用特殊的NHibernate類型......我真的不明白爲什麼沒有構建支持uint,ushort等類型? – user3072 2010-07-20 19:58:54