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

标签 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) 根据定义,属性不应抛出异常。您的方法违反了这一最佳实践。

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/

相关文章:

sql-server - SQL Server - 表似乎被阻止

c# - 没有外键的 NHibernate 映射引用

c# - 显示当前时间 WPF

c# - finally block 中抛出异常后的返回值会怎样?

nhibernate - JoinQueryOver 和 JoinAlias 有什么区别?

c# - 从 nHibernate 获取执行的 SQL

c# - IT-Hit WebDAV 服务器结帐模式和与 MS Office 的交互

c# - inlineShape = inlineShapes.AddPicture() ;引用任何 word 文件,而不是我创建的 Interop.Word.Application

c# - 没有参数的方法如何分配给 ExpandoObject?

nhibernate - 如何在长期存在的 Windows 窗体应用程序中管理 NHibernate session ?