Fluent nhibernate NHibernate中的空值对象
我有一个person实体,其中包含一个地址作为值对象:Fluent nhibernate NHibernate中的空值对象,fluent-nhibernate,null,nhibernate-mapping,value-objects,Fluent Nhibernate,Null,Nhibernate Mapping,Value Objects,我有一个person实体,其中包含一个地址作为值对象: 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.A
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);
});
}
公众人物()
{
WithTable(“人”);
Id(x=>x.Id);
组件(x=>x.地址,a=>
{
a、 Map(x=>x.Address1);
a、 Map(x=>x.Address2);
a、 Map(x=>x.Address3);
a、 地图(x=>x.Town);
a、 地图(x=>x.邮政编码);
});
}
它在NHibernate文档中声明,如果值对象(Address1、Address2等)的所有属性都为null,则整个组件将映射为null(即Person.Address为null)。在所有地址字段都为空的情况下,这会给我带来问题,因为在我的页面中,我可能有(我正在进行ASP MVC):
x.Address.Address1))%>
这会因空引用异常而中断。因此,我正在寻找一种干净的方法,将Address设置为一个新的Address()对象,而不是当我从数据库中加载一个人时,如果所有字段都为空,则不需要手动执行该操作。我已经打消了以下想法:
在我的视图中执行空检查(yuk,可怕)
使数据库字段不可为空(我正在处理遗留数据库)
有人有什么想法吗?我没有任何明确的答案来创建一个未映射的方法/属性访问器,如果实际地址为空,它将返回一个默认/空对象
public Address GetAddressOrDefault()
{
return Address ?? new NullAddress();
}
或者与第一个类似,为您在视图中使用的地址
创建一个包装器
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的想法(参见他的回答和评论),我已将我的个人实体的Address属性修改为:
public virtual string Address { get; set; }
致:
这解决了我的问题,它有效,而且似乎与NHibernate有效。是的 在某些情况下,编写NHibernate自定义类型非常容易。它将返回null对象,而不是将组件设置为null。我在某些情况下这样做了,然后你可以忘记空值
.一旦你真的需要在UI中编辑地址,而不仅仅是显示地址,就会变得非常难看,是吗?是的,有更好的建议吗?好主意,谢谢!修改实际映射的地址属性访问器以允许像往常一样获取和设置,但在get“Address??new Address();”中使用null检查是可行的。我现在可以加载和编辑地址,即使它们是空的,而无需修改我的视图,hibernate也不会混淆。
public virtual string Address { get; set; }
private Address _address;
public virtual Address Address
{
get { return _address ?? new Address(); }
set { _address = value; }
}