【问题标题】:Nhibernate interceptors not picking up properties of base classNhibernate 拦截器没有获取基类的属性
【发布时间】:2012-05-01 20:44:35
【问题描述】:

我正在从 Fluent 转换为 Loquacious,并且遇到了一个问题,即我的拦截器没有像我认为的那样获取所有字段。如果我查看 OnSave 函数

public override Boolean OnSave(Object entity, Object id, Object[] state,
        String[] propertyNames, IType[] types)

并查看 propertyNames,其中唯一的项目是在映射文件中显式映射的项目(在示例中,这只是 ID、Start 和 End)。

在我的情况下,虽然我有一个根本没有映射的基类。相反,它只包含由拦截器填写的属性。这曾经在 Fluent Nhibernate 中工作,但现在我已经迁移到 Nhibernate 3.3,我无法再让它工作了。

我的类/映射看起来像这样

public class BaseAuditEntity
{
  public virtual int ModifiedByUserID { get; set; }
  public virtual DateTime LastModifiedTime { get; set; }
}

public class Foo : BaseAuditEntity
{
  public virtual int ID { get; protected internal set; }
  public virtual DateTime Start { get; protected internal set; }
  public virtual DateTime End { get; protected internal set; }
}

public class FooMap: ClassMapping<Foo>
{
  Id(x => x.ID, m => m.column("fooID"));
  Property(x => x.Start, m => m.column("start"));
  Property(x => x.End, m => m.column("end"));
}

关于如何完成这项工作的任何想法?我不想在每个类都映射这个,而且我认为我不需要映射 BaseAuditEntity,至少在 Fluent 中不需要它。

【问题讨论】:

  • 您是否在 FNH 中使用了自动映射?

标签: nhibernate nhibernate-mapping


【解决方案1】:

你可以创建一个基础映射类

public class BaseAuditEntityMapping<T> : ClassMapping<T> where T: BaseAuditEntity
{
    ManyToOne(x => x.ModifiedByUser);
    Property(x => x.LastModifiedTime);
}

public class FooMap: BaseAuditEntityMapping<Foo>

【讨论】:

  • 虽然它不是我想要的那样有效,但我希望不要将所有映射更改为指向 BaseAuditEntityMapping,但在这方面有效。谢谢。
  • FNH 不会自行映射它们,除非您使用自动映射。您可以使用代码映射等效于自动映射来获得相同的效果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
相关资源
最近更新 更多