2014-01-17 42 views
2

當更新實體我有這樣的實體:NHibernate的選擇

public class Permission 
{ 
    public virtual int Id{get;set;} 
    public virtual string Entity { get; set; } 
    public virtual bool ReadAction { get; set; } 
    public virtual bool UpdateAction { get; set; } 
    public virtual bool CreateAction { get; set; } 
    public virtual bool DeleteAction { get; set; } 
    public virtual Role Role { get; set; } 

    public virtual string RoleName 
    { 
     get { return Enum.GetName(typeof(Role),this.Role} 
    } 
} 

public class PermissionMap : ClassMap<Permission> 
{ 
    public PermissionMap() 
    { 
     Id(x => x.Id, "id").GeneratedBy.Identity().UnsavedValue(0); 
     Map(x => x.Entity); 
     Map(x => x.DeleteAction).CustomType<BooleanType>(); 
     Map(x => x.ReadAction).CustomType<BooleanType>(); 
     Map(x => x.CreateAction).CustomType<BooleanType>(); 
     Map(x => x.UpdateAction).CustomType<BooleanType>(); 
     Map(x => x.Role).CustomType<int>(); 
    } 
} 

public enum Role 
{ 
    Administrator = 0, 
    SalesPerson = 1, 
    Marketing = 2 
} 

我每次查詢它獲取更新數據庫。
我認爲這是因爲RoleName,但事件時,我已經刪除它仍然得到更新。
權限獲取數據庫中每行的更新。 謝謝

+3

發生了什麼事是1)查詢是事務的一部分*(好,有同花順()在請求結束調用) *和2)映射不適合數據庫設置,主要針對空列和非空列。因此,如果DB包含可空布爾值,並且該值爲NULL,則映射表示:它是bool *(不可爲空)* ...在會話中非常髒的對象...將其修復爲數據庫。換句話說,首先檢查列的可空性... –

+0

@RadimKöhler,謝謝,我清理了所有可爲空,重新創建了模式,並且問題仍在發生。謝謝 – Shazam

+2

問題是,我們一直在與會議合作。它非常智能*即使在讀取操作期間,它也可以通過它們的ID跟蹤所有項目。如果任何對象以某種方式被改變*(例如,爲了渲染或傳輸原因)*並且仍然被打開的會話引用,則它被管理爲髒的。當調用session.Fulsh()時(通常在事務Commit()或甚至auto上默認取決於FlushMode)時,任何髒對象都會被持久化。有這個:調查你是否沒有改變任何對象......而打開會話。 NHibernate是可預測的,這不會是一個錯誤;) –

回答

2

正如評論中所討論的那樣,問題是,我們一直在與會議合作。它非常聰明,即使在讀取操作期間,它也可以通過其ID來跟蹤所有項目。

如果任何對象以某種方式改變了(例如,爲了呈現或轉移的原因)並且仍然被打開的會話引用,則它被管理爲髒的。當調用session.Fulsh()(通常在事務Commit()或甚至auto上默認取決於FlushMode)時,任何髒對象都會被持久化。

因此,爲避免發佈UPDATE語句,實體映射及其內容必須匹配。截至年底Shazam的成立了,在這種情況下,罪魁禍首是這個映射

// Map(x => x.Role).CustomType<int>(); 
Map(x => CustomType<Role>() 
+0

我認爲我從你的2條第一條評論中學到了最多,我不知道關於同花順的髒兮兮,再次感謝 – Shazam

+0

好極了,如果這有幫助的話。享受NHibernate,簡直是超棒的工具;) –