c# - 使用 Fluent NHibernate 覆盖 C# 属性访问器方法的基本行为

标签 c# .net nhibernate fluent-nhibernate fluent

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

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 抛出异常:

An exception of type 'System.InvalidOperationException' occurred in FluentNHibernate.dll but was not handled in user code. Additional information: Tried to add property 'active' when already added.

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

最佳答案

我不太确定你问题的根源,但是,试着回答你的问题:

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

映射私有(private)属性或字段:

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; }
}

关于c# - 使用 Fluent NHibernate 覆盖 C# 属性访问器方法的基本行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931855/

相关文章:

c# - 如何使用 Xamarin 表单的 Button.ContentLayout 属性?

c# - 如何在启动进程之前重定向 STDIN .NET 进程

c# - 从 AJAX 结果呈现 HTML 内容

NHibernate:如何注入(inject)对实体的依赖

c# - NHibernate 不支持指定的方法

c# - 为什么 Scoped 服务会解析为同一请求的两个不同实例?

c# - C# 中的++ 操作是原子的吗?

c# - 面板滚动 c#

c# - 为什么 Process.PrivateMemorySize64/1024 与 Windows 任务管理器内存(专用工作集)不匹配?

c# - 是否可以使用 Nhibernate 将 Workflow Foundation 中内置的状态机持久保存到数据库中?