문제

주소를 값 객체로 포함하는 사람 엔티티가 있습니다.

public Person()
{
    WithTable("Person");
    Id(x => x.Id);
    Component<Address>(x => x.Address, a =>
    {
        a.Map(x => x.Address1);
        a.Map(x => x.Address2);
        a.Map(x => x.Address3);
        a.Map(x => x.Town);
        a.Map(x => x.Postcode);
    });
}

그것은 nhibernate 문서에서 값 객체 (address1, jand 이것은 내 페이지에서 내가 가질 수있는 페이지에서 (ASP MVC를하고 있음) 모든 주소 필드가 무효 인 경우 문제를 제시합니다.

<%= Html.TextBoxFor((x => x.Address.Address1))%>

이것은 널 참조 예외로 중단됩니다. 따라서 수동으로 수행하지 않고 데이터베이스에서 사람을로드 할 때 모든 필드가 비어있는 경우 NULL이 아닌 새 주소 () 객체로 주소를 설정하는 깨끗한 방법을 찾고 있습니다. 다음 아이디어를 할인했습니다.

내 관점에서 널 체크인 (yuk, 끔찍한)

데이터베이스 필드 만들기 불가능하지 않습니다 (레거시 데이터베이스를 다루고 있습니다)

누구든지 아이디어가 있습니까?

도움이 되었습니까?

해결책

맵핑되지 않은 메소드/속성 액세서를 만드는 명확한 답변이 없으며 실제 주소가 NULL 인 경우 기본값/NULL-OBJECT를 반환합니다.

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}

또는 첫 번째와 유사하게, 당신의 래퍼를 만듭니다. Address 당신이보기에서 사용하는 것.

public class AddressViewData
{
  private Address address;

  public AddressViewData(Address address)
  {
    this.address = address ?? new NullAddress();
  }

  // expose all address properties as pass-throughs
  public string Street
  {
    get { return address.Street; }
  }
}

다른 팁

James의 아이디어 (그의 답변과 의견 참조) 덕분에 나는 내 개인 단체의 주소 속성을 수정했습니다.

public virtual string Address { get; set; }

에게:

private Address _address;
public virtual Address Address
{
    get { return _address ?? new Address(); }
    set { _address = value; }
}

이것은 내 문제를 해결하고 작동하며 Nhibernate와 함께 작동하는 것 같습니다. 예!

경우에 따라 nhibernate 사용자 정의 유형을 작성하는 것은 매우 쉽습니다. 구성 요소를 NULL로 설정하는 대신 NULL 객체를 반환합니다. 나는 어떤 경우에는 이것을했고, 당신은 널을 잊을 수 있습니다.

복합 사용자 유형의 예.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top