2014-09-24 2 views
0

다음 코드에서 볼 수 있듯이 Save 메서드에서 세션을 닫습니다. 나는 그것이 AddUserSettings가 작동하지 않는 thats 이유를 추측한다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? Save 방법 세션을 닫는 것이 나쁜 생각입니까? UserSettings에 DB에 아직 사용자가 없으므로 문제가 발생합니까? 세션을 어떻게 처리합니까?세션 외부의 클래스 작업

사용자

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에 수 없습니다 배치 여러 삽입/업데이트 함께

  • 더 왕복
  • 하나 이상의 엔티티에 대해 트랜잭션을 정의 할 수 없습니다 !!! 데이터베이스가 각 삽입/업데이트 거래를 만들어야합니다
  • 끔찍한 성능 때문에
  • changetracking이 암시 적으로 처리해야합니다 (변경할 수있는 메소드를 호출합니다 ("프레임 워크"를 선택한 다음 하나 개의 세션 및 트랜잭션과 10K 사용자를 삽입하십시오) 엔티티와 세션은 변경된 경우에만 업데이트됩니다. 항상/모든 변경 사항을 알 수 없으므로 모든 필드를 업데이트합니다.)
  • 항상 하나의 글로벌 NHibernateHelper (sessionfactory)가 있기 때문에 단위 테스트가 더 어렵습니다.
  • 당신을 위해 할 세션이 있기 때문에 질문에 명시된 문제를 피하기 위해 당신의 사업 논리에 엔티티를 생성/저장해야합니다 닫힘

ActiveRecord 패턴을 사용할 때 세션을 처리하는 방법은 Caslte.ActiveRecord example을 참조하십시오. 본질적으로 세션은 의미있는 트랜잭션 경계와 성능 향상을 위해 컨텍스트 당 공유됩니다.

또는 엔티티 외부에서 세션을 사용하도록 전환하여 더 많은 옵션과 기능을 처리 할 수 ​​있습니다.