nhibernate의 널 값 객체
-
22-08-2019 - |
문제
주소를 값 객체로 포함하는 사람 엔티티가 있습니다.
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 객체를 반환합니다. 나는 어떤 경우에는 이것을했고, 당신은 널을 잊을 수 있습니다.
제휴하지 않습니다 StackOverflow