2011-02-08 6 views
2

와 MVC2에서 조회 및 지속 객체를 관리 내 단순화 된 도메인 모델은 다음과 같이 보입니다 :은 NHibernate에

public abstract class Entity<IdK> 
{ 
    public virtual IdK Code { get; protected set; } 
} 

public class Contact : Entity 
{ 
    public virtual string Name { get; set; } 
    public virtual Company Company { get; set; } 
} 

public class Company : Entity 
{ 
    public virtual string Name { get; set; } 
} 

을하고 나는 ViewModel에 정의했습니다 :

public ContactViewModel() 
    { 
      public Guid Code { get; set; } 
      public int Version { get; set; } 

      public string Name { get; set; } 
      public string Company { get; set; } 

      public List<SelectListItem> Companies { get; set; } 
    } 

이보기에 내 연락처를 관리하기를 . 사용자가 내 양식을 제출하면, 이제

<%=Html.ListBoxFor(m => m.Company, (List<System.Web.Mvc.SelectListItem>)Model.Companies)%> 

:
나는 사용자가이 같은 내보기에 렌더링되는 SelectedListItem의 목록을 추가 한 기업의 목록에서 선택 할 수 있도록하려면 때문에 내 모델을 저장하기 전에 뷰 모델을 다시 매핑합니다.
연락처를 채우고 ContactViewModel.Company의 ID를 사용하여 Company 유형의 개체를 만들어 Contact 클래스의 속성과 연결합니다.
데이터베이스에서 전체 회사를 가져 오지 않으려 고하기 때문에 이드를 채 웁니다. 연락처를 유지할 때 예외가 발생합니다. "not-null 속성은 null 또는 일시적인 Domain.Contact.Company"를 참조합니다..
MVC + Nhibernate에서 조회 및 지속성을 관리하는 가장 좋은 솔루션은 무엇입니까?
귀하의 경험에 대한 의견이 있으십니까?

답변

2

불행히도 NHibernate 및 조회를 사용하면 Company 개체의 새 인스턴스에 ID 속성을 할당 한 다음 해당 Company 개체를 연락처에 할당 할 수 없습니다.

public Contact Save(Contact contact) 
{ 
    if(contact.Company.Id > 0) 
     contact.Company = Session.Load<Company>(contact.Company.Id); 

    Session.SaveOrUpdate(contact); 
} 

나는 일반적으로 찾을 당신이 논리를 캡슐화 할 수 있습니다 : 내가 할 것입니다 일반적으로 어떤

는 연락처를 절약 이런 일 때 회사 정보를 변경할 수 없다는 가정 내 저장소에 또한 회사에 로딩을 제공 할뿐만 아니라 모든 세션을 단일 세션으로 멋지게 처리 할 수 ​​있습니다. 이렇게하지 않으면 here

설명 된대로 이러한 방식으로 만일 Session.load를 사용

데이터베이스를 치는 것을 피한다, 당신이 기본적으로 NHibernate에로 말하고있는 것은 당신이 당신이 회사 객체를 가지고있다 ID를 할당하고 지금은 모든 속성이 Null 또는 빈 문자열 값 또는 무엇이든지 원하는대로 설정되지 않은 상태로 저장하려고합니다.

은 또한이 같이 보입니다 저장 특정 도메인 개체를 만들 수 있습니다

데이터베이스에 연락처 테이블에 직접 매핑
public abstract class Entity<IdK> 
{ 
    public virtual IdK Code { get; protected set; } 
} 

public class SavableContact : Entity 
{ 
    public virtual string Name { get; set; } 
    public virtual IdK CompanyId { get; set; } 
} 

이 엔티티를 저장 할 때 당신은 말 그대로 그냥 회사 ID를 다시 매핑 할 수 있도록 당신의 뷰 모델로부터 NHibernate는 단지 그 값을 저장하고 회사 오브젝트에 대해서 전혀 신경 쓰지 않을 것이다.

가장 적합한 방법을 찾아내는 경우입니다. 개인적으로 로직의 추가 비트가 도메인 모델을 단순화하는 데 도움이되는 첫 번째 옵션을 선호하지만 공용 API를 만들고 노출하는 경우 두 번째 방법이 더 적합 할 수 있습니다.

+0

감사합니다. lomaxx. 나는 첫 번째 옵션을 선택할 것입니다. 그렇게 조회를 관리하는 방식입니까? – LeftyX

+0

예, 저는 그에게 첫 번째 방법을 사용합니다.우연히 일부 독서를하고 있었고 지난 밤에 수행 한 일부 테스트와 결합 된이 정확한 문제를 설명하는 게시물에 대한 링크를 추가하여 데이터베이스가 손상되는 것을 피하면서 이것이 올바른 방법임을 암시합니다. – lomaxx

+0

나는 당신의 해결책을 시도하고 그것을 잘 작동합니다. 당신의 도움을 주셔서 감사합니다. – LeftyX