gpt4 book ai didi

c# - NHibernate 是否覆盖映射的 setter ?

转载 作者:行者123 更新时间:2023-11-30 22:39:47 24 4
gpt4 key购买 nike

我想在 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 写入数据库,而域可以使用方便的 List 而不会影响性能,因为(反)序列化仅在加载/保存对象时发生。

3) 有许多验证实践,有些更喜欢属性,有些更喜欢每个域对象一个验证类。

我会选择后者,因为它最灵活,而且您不会弄乱数据对象,并且可以轻松验证整个对象。

属性方式的一个搜索词是“数据注释”。例如,谷歌提出了这个结果: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com