我有一堆C#类,它们从一个抽象基类继承了许多属性。所有类型都使用Fluent NHibernate映射到数据库模型,所有属性定义都使用自动获取器和设置器(标准“get; set;”语法)。我最近发现需要为其中一个派生类型的基类型属性的访问器方法之一提供特定的实现。因此,我创建显式支持字段的基础类属性:用Fluent NHibernate覆盖C#属性存取方法的基本行为
public abstract class BaseEntity : IBaseEntity
{
protected bool active_field;
...
public virtual bool active { get { return active_field; } set { active_field = value; } }
...
}
然后定义的特定的吸气剂逻辑在派生类型定义中的“活跃”属性:
public override bool active
{
get { return active_field && (this.Expiration == null || this.Expiration < DateTime.Now); }
set { active_field = value; }
}
当我火了该项目虽然NHibernate抛出一个异常:
在FluentNHibernate.dll中发生类型'System.InvalidOperationException'的异常,但未在用户代码中处理。 附加信息:尝试添加属性'活动'时已添加。
我猜这与NHibernate需要提供它自己的属性定义覆盖(因此为什么它需要属性被声明为虚拟的第一位),但我并不是全部NHibernate的精明。既然如此,我很乐意提供任何其他细节,但不知道还有什么相关的。有没有明显的原因,为什么这不起作用?如果是这样,是否有一个简单的解决方法?
如果您为另一个非公有虚拟属性创建'active'非虚拟包装怎么办? 'NHibernate'会填充非公有财产吗? –
所以你有'ClassMap'显式映射或使用Automapping?此外,覆盖是有缺陷的,因为即使active_field值没有改变,活动值也会改变。更好地区分'IsActivated' /'IsEnabled'(持续)和'IsActive' –
Firo
这是使用自动映射。我不确定你在后半部分的含义。所有派生自BaseEntity的类型都可以通过将活动位设置为0来“软删除”。最近我添加了一些BaseEntity类型,它们有过期日期,并且我有一个完整的代码库,它已经明确地检查了活动字段在检查数据时。当然,我的目标是能够查看一个BaseEntity类型,如果过期已过,则将过期属性视为不活动,而无需在已检查活动字段的位置手动检查它。那是不好的形式? –