在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的文档,如果一个值对象(地址1,地址等)的所有属性都为空时,整个组件将被映射为空(即Person.Address将为空)。这是给我的问题在所有地址字段为空,因为在我的网页情况下,我可能会(我在做ASP MVC):
<%= Html.TextBoxFor((x => x.Address.Address1))%>
这打破了一个空引用异常。所以,我在找一个干净的方式来设置地址作为新地址()对象,而不是空,如果所有字段为空,当我从数据库装载一个人没有做手工。我已经贴现以下思路:
否则空检查在我的视图(议员,可怕的)
制作数据库字段不为空的(我处理旧的数据库)
任何任何想法?
解决方案
我没有任何明确的答案创建未映射的方法/属性访问,并且返回默认/空对象如果实际地址为空。
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; }
}
}
其他提示
由于詹姆斯的观点(见他的回答和评论)我已经修改从我个人实体的地址属性:
public virtual string Address { get; set; }
为:
private Address _address;
public virtual Address Address
{
get { return _address ?? new Address(); }
set { _address = value; }
}
这解决了我的问题,它的工作原理,这似乎与NHibernate工作。 Yey!
在某些情况下,它是很容易编写的NHibernate自定义类型。而不是设置组件空的,它会返回null对象。我在某些情况下这样做,那么你可以忘掉空。
复合用户类型的实施例。
不隶属于 StackOverflow