0

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

例如,我有一个具有 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”属性的设置方法中,它将在从数据库中水合对象时触发,这不是我想要的。

这一切都很好。

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

我不喜欢这一点的事实是,您正在编写针对 Person.Name 的代码,但必须针对 Person._name 编写查询,这容易出错且令人困惑。

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

4

1 回答 1

0

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

例如:

<property name="Name" column="Name" type="String" access="nosetter.camelcase-underscore"/>
于 2011-12-22T15:40:58.887 回答