NHibernate是否覆盖映射的setter?

时间:2011-04-04 20:39:01

标签: c# nhibernate

我想在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 个答案:

答案 0 :(得分: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而不会影响性能,因为(de)序列化仅在加载/保存对象时发生。

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

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

属性方式的一个搜索词是“数据注释”。谷歌提出了这个结果,例如:http://stephenwalther.com/blog/archive/2008/09/10/asp-net-mvc-tip-43-use-data-annotation-validators.aspx

如果您进行数据绑定,可以查看IDataErrorInfo界面。