我如何确定一个值是由 NHibernate C# 还是应用程序代码设置的?

How can I to determine if a value is set by NHibernate C# or by application Code?

我有一个对象 属性 的自定义 setter,我想向其添加一些自定义日志记录,这样我就可以查看日志并查看该值何时更改。但是,似乎每当 NHibernate 从数据库中读取该值并填充对象时,就会触发日志记录。有没有办法以编程方式确定更改正在发生,因为 NHibernate 正在填充对象?

public virtual string URL
        {
            get
            {
                return pURL;
            }
            set
            {
                if (!value.ToLower().Contains("https://"))
                {
                    specialLog.Warn($"Set a URL to {value} with no HTTPS. Callstack: {Environment.StackTrace}"); //This is triggered on NHibernate read always
                }

                pURL = value;
            }
        }

您需要更改映射以让 NHibernate 知道您要对此 属性 使用 "field" 访问策略。这样 NHibernate 将绕过设置器并直接设置字段,避免任何自定义逻辑。

如果您正在使用 hbm.xml 映射,您可以按如下方式更改属性的映射:

<property name="pURL" column="URL" access="field">

对于代码映射:

c.Property("pURL", m =>
{
    m.Column("URL");
    m.Access(Accessor.Field);
});