我想在 NHibernate 映射对象中执行此操作:
private ShiftTradeOffer m_Offer;
public virtual ShiftTradeOffer Offer{
get {
return m_Offer;
}
set {
//... Do some stuff ...
if (condition)
{
m_Offer = value;
} else {
throw new Exception("whoops!");
}
}
}
(ShiftTradeOffer 是映射属性)
1)这种事情会造成问题吗?
2) 创建对象时是否调用此 setter?
3)就强制验证而言,这是否违反最佳实践?我希望在此类中嵌入特定于对象的行为。
最佳答案
1) 根据定义,属性不应抛出异常。您的方法违反了这一最佳实践。
2) 原始的 setter 被调用,因为 NHibernate 只是创建一个代理来调用底层的 getter/setter。 我们使用包含序列化逻辑的属性来映射序列化数据,否则这些数据将无法工作。
示例:
public virtual List<Foo> Foos {get;set;}
public virtual string SerializedFoos
{
get { return JsonConvert.Serialize(Foos); }
set { Foos = JsonConvert.Deserialize<List<Foo>>(value); }
}
仅映射 SerializedFoos
属性,域代码可与 Foos
属性配合使用。因此,NHibernate 将漂亮的 JSON 写入数据库,而域可以使用方便的列表,而不会影响性能,因为(反)序列化仅在对象加载/保存时发生。
3) 有很多验证实践,有些更喜欢属性,有些更喜欢每个域对象的验证类。
我会选择后一种,因为它最灵活,而且您不会弄乱数据对象,并且可以轻松验证整个对象。
属性方式的一个搜索词是“数据注释”。例如,Google 给出了这个结果:http://stephenwalther.com/blog/archive/2008/09/10/asp-net-mvc-tip-43-use-data-annotation-validators.aspx
如果您进行数据绑定(bind),您可以查看 IDataErrorInfo
接口(interface)。
关于c# - NHibernate 是否会覆盖映射的 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5544062/