使用 Fluent NHibernate 重写 C# 属性访问器方法的基本行为

本文关键字:方法 访问 NHibernate Fluent 重写 属性 使用 | 更新日期: 2023-09-27 18:37:21

我有一堆C#类,它们从抽象基类继承了许多属性。所有类型都使用 Fluent NHibernate 映射到数据库模型,并且所有属性定义都使用自动 getter 和 setter(标准"get;设置;"语法)。我最近发现需要为派生类型的一个基类型属性的访问器方法之一提供特定的实现。因此,我为基类属性创建了一个显式支持字段:

public abstract class BaseEntity : IBaseEntity
{
    protected bool active_field;
    ...
    public virtual bool active { get { return active_field; } set { active_field = value; } }
    ...
}

然后在派生类型定义中为"active"属性定义了特定的 getter 逻辑:

public override bool active
    {
        get { return active_field && (this.Expiration == null || this.Expiration < DateTime.Now); }
        set { active_field = value; }
    }

但是,当我启动该项目时,NHibernate抛出了一个异常:

在 FluentNHibernate 中发生了类型为"System.InvalidOperationException"的异常.dll但未在用户代码中处理。 其他信息:已添加时,已尝试添加属性"活动"。

我猜这与 NHibernate 需要为属性定义提供自己的覆盖有关(因此它首先需要将属性声明为虚拟),但我并不是那么精通 NHibernate。既然如此,我很乐意提供任何其他细节,但真的不知道还有什么相关的。这行不通有什么明显的原因吗?如果是这样,有没有简单的解决方法?

使用 Fluent NHibernate 重写 C# 属性访问器方法的基本行为

我不确定您问题的根源,但是,试图回答您的问题:

  1. NHibernate需要所有属性都是虚拟的,以便允许延迟加载,因为它创建实体类型的代理类型(这是类的扩展)。它需要它们是虚拟的,以便它可以覆盖它们并在其中注入新行为(用数据库值填充它们);
  2. 您可以映射非公共属性和字段,但您必须显式执行此操作,请遵循有关如何使用FluentNHibernate执行此操作的示例。

映射私有属性或字段:

public class EntityMap : ClassMap<Entity>
{
    Id(e => e.Id).GeneratedBy.Identity();
    Map(Reveal.Member<Entity>("PrivatePropertyName"));
}

现在有一个尝试解决问题的建议:您可以使用 new 关键字隐藏扩展类上的属性(该属性仍然需要是虚拟的)。

public virtual new bool active
{
    get { return active_field && (this.Expiration == null || this.Expiration < DateTime.Now); }
    set { active_field = value; }
}