你如何命名(和映射)支持属性?

时间:2011-12-22 15:28:53

标签: nhibernate mapping backing-field

在少数情况下,由于实际原因,我有一个需要“支持财产”的财产。

例如,我有一个带有Name属性的类型 - 没有对访问时发生的值的转换,它只是触发某种行为;副作用,如果你愿意的话。 (并不是为了讨论而重要,但在这种特殊情况下,名称会在更改时复制到其他位置。)

让我们说:

public class Person
{
    private string __name;

    protected internal virtual string _name
    {
        get
        {
            return this.__name;
        }
        set
        {
            this.__name = value;
        }
    }

    public virtual string Name
    {
        get
        {
            return _name;
        }

        set
        {
            _name = value;

            // action when changing the name takes place here...
        }
    }
}

因此“_name”属性映射到数据库,但保持受保护/内部,因此无法直接修改它。第二个公共财产“名称”提供实际访问权限。

我设置这种方式的原因是因为如果该操作直接构建到映射的“_name”属性的set-method中,那么当一个对象从数据库中水合时会触发它,这不是我的意思想。

这一切都正常。

问题是,当您需要查询此类型时,尝试查询Person.Name将不起作用,因为该属性未映射!

我不喜欢这个,是你正在编写针对Person.Name的代码,但是必须针对Person._name编写查询,这很容易出错并且容易混淆。

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以使用 nosetter.camelcase-underscore 进行映射中的访问吗?这将直接设置字段(如果命名正确,例如_name),而不是使用属性设置器。

例如:

<property name="Name" column="Name" type="String" access="nosetter.camelcase-underscore"/>