2014-09-24 45 views
0

如您在下面的代碼中看到的,我在Save方法中關閉了會話。我想這就是爲什麼AddUserSettings不起作用。做這項工作的最佳做​​法是什麼?在Save方法壞主意是關閉會議?在UserSettings保存數據庫中沒有用戶,那麼是否會產生問題?我如何處理會議之外的事情?課外作業

用戶

public class User : BaseClass<User> 
{ 
    public virtual int UserId { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string Email { get; set; } 
} 

public virtual void AddUserSettings(UserSettings us) 
{ 
    us.User = this; 
    UserSettings = us; 
} 

UserSettings

public class UserSettings : BaseClass<UserSettings> 
{ 
    public virtual int UserSettingsId { get; set; } 
    public virtual User User { get; set; } 
    public virtual string FacebookId { get; set; } 
    public virtual string FacebookToken { get; set; } 
} 

保存方法

using (var session = NHibernateHelper.OpenSession()) 
{ 
    using (var transaction = session.BeginTransaction()) 
    { 
      session.SaveOrUpdate(x); 

      transaction.Commit(); 
    } 
} 

代碼

user = new Entity.User(); 
us = new Entity.UserSettings(); 

us.FacebookId = "foo"; 
us.FacebookToken = "foo"; 
user.AddUserSettings(us); 
us.Save(); 

user.UserName = "foo"; 
user.FirstName = "foo"; 
user.LastName = "foo"; 
user.Email= "foo"; 

user.Save(); 

回答

0

我發現了這個問題;

首先,我需要創建主要對象,然後保存,然後我可以添加沒有問題的子類。

user = new Entity.User(); 
user.UserName = "foo"; 
user.FirstName = "foo"; 
user.LastName = "foo"; 
user.Email= "foo"; 
user.Save(); 

us = new Entity.UserSettings(); 
us.FacebookId = "foo"; 
us.FacebookToken = "foo"; 
user.AddUserSettings(us); 
us.Save(); 
1

環節應該根據業務操作中使用這樣的微在每一個管理其保存方法是不是一個好主意:

  • 更多往返因爲NHibernate的不能批多個插入/更新一起
  • 無法定義超過一個實體的交易!!!
  • 可怕的性能,因爲數據庫必須對每個插入/更新創建一個交易(請嘗試將10K用戶與你的「框架」,然後用一個會話和交易)
  • changetracking必須被隱式處理(調用這可能會改變的方法一個實體和會話將更新,只有當它已經改變vs在你的情況下,它會一直更新所有字段,因爲它不知道是否/改變了什麼)
  • 單元測試比較困難,因爲總是有一個全局的NHibernateHelper(sessionfactory)
  • 您必須以正確的順序在您的buisiness邏輯中創建/保存實體,以避免問題中陳述的問題,因爲會爲您做的會話已關閉

有關如何在使用ActiveRecord模式時處理會話的信息,請參閱Caslte.ActiveRecord example。本質上,會話是根據上下文共享的,以實現有意義的事務邊界和性能增益。

或者您切換到使用實體之外的會話,以便您有更多的選項和NHibernate的功能供您處理。