2011-12-01 26 views
0

我在後端使用NHibernate的ActiveRecord。我爲用戶建立了一個映射;我可以創建/檢索/註冊用戶沒有任何問題。無法通過NHibernate/ActiveRecord將字段保存到Aspnet_Users

我現在想爲我的用戶(每個角色許多用戶)添加一個名爲Role的關聯。我創建了合適的Role類,表格,數據等等,並且所有內容似乎都在爲此而努力。

問題是,當我保存用戶並關聯Role時,該關聯不會持續到數據庫。

我已將RoleId (int16)列添加到aspnet_Users表中以匹配角色表的Id (int16)列。我試過用SaveSaveAndFlush沒有成功。

下面是一些代碼:

Role superUser = Role.First(r => r.name == "Super User"); 
User me = User.First(r => r.UserName == myUserName); 
me.Role = superUser; 
me.Save(); // Or: SaveAndFlush 

調試時,我可以看到,當他們保存的對象的關聯(即me.Role不爲空,並有正確的屬性/屬性/等)但是,當我查看數據庫時,該用戶的RoleId值仍然是NULL。 (SaveAndFlush沒有什麼區別。)

我錯過了什麼?

我讀過SO上的某個地方,擴展用戶表通常是通過添加另一個表並通過外鍵鏈接兩個表完成的;我假設這些類將使用新的ExtendedUser類的構圖繼承。假設我不想走這條路線,爲什麼這不起作用?是否因爲特定的ASP.NET MVC存儲過程等。所有?

一些相關的映射:

[ActiveRecord("aspnet_Users", Mutable = false)] 
    public class User : ActiveRecordLinqBase<User> 
    { 
     [PrimaryKey(PrimaryKeyType.Assigned)] 
     public Guid UserId { get; set; } 

     // ... 

     [BelongsTo("RoleId", Cascade = CascadeEnum.SaveUpdate)] 
     public Role Role { get; set; } 
    } 

    [ActiveRecord] 
    public class Role : ActiveRecordLinqBase<Role> 
    { 
     [PrimaryKey] 
     public int Id { get; set; } 

     // ... 

     [HasMany(Inverse = true)] 
     public IList<User> Users { get; set; } 

     [Property] 
     public string Name { get; set; } 
    } 

回答

0

編輯:可變=「假」 - 這顯然代表該實體是隻讀的,這是你的問題的根源。

應用程序不能更新或刪除不可變類mutable =「false」。這允許NHibernate進行一些小的 性能優化。

另外: 我相信你需要有層疊定義。你不是隻保存實體本身,而是參考其他實體。使用屬性,流暢的配置或hbml來定義你需要的方式。以下是級聯選項:

下面是每個級聯選項意味着:

  • 沒有 - 沒有做任何級聯,讓用戶可以通過 處理它們自己。
  • save-update - 當對象被保存/更新時,檢查相關並保存/更新任何需要它的對象(包括 保存/更新多對多方案中的相關)。
  • 刪除 - 刪除對象時,刪除關聯中的所有對象。 delete-orphan - 刪除對象時,刪除關聯中的所有對象。除此之外,當一個對象被從關聯中刪除並且未與另一個對象 (孤立)關聯時,也將其刪除。
  • 全部 - 當一個對象是保存/更新/刪除時,檢查assoications並保存/更新/刪除所有找到的對象。
  • all-delete-orphan - 當一個對象是保存/更新/刪除時,檢查相關並保存/更新/刪除找到的所有對象。除此之外,當一個對象從assoication中被移除並且不與另一個對象(孤立的)關聯時,也將其刪除。

您可能想要閱讀this article

+0

我在User.Role上添加了'Cascade = CascadeEnum.SaveUpdate',但我仍然看到相同的行爲。 – ashes999

+0

如果你改變你的用戶實體(這不是引用)的一些其他屬性,它是否持續到數據庫? – Eduard

+0

等一下,我看到有什麼不對:mutable =「false」 - 這顯然表明該實體是隻讀的。 – Eduard