将未映射的数据添加到NHibernate

将未映射的数据添加到NHibernate,nhibernate,interceptor,Nhibernate,Interceptor,我有一个对象,我正试图使用NHibernate持久化到遗留数据库。我在我的域对象中映射了一个表中的所有相关列,但表中有一些字段必须为遗留数据库的结构填充 根据一些建议,我创建并注册了一个NHibernate拦截器来完成这项工作 public class CustomLineItemInterceptor : EmptyInterceptor { public override bool OnSave(object entity, object id, object[] state, s

我有一个对象,我正试图使用NHibernate持久化到遗留数据库。我在我的域对象中映射了一个表中的所有相关列,但表中有一些字段必须为遗留数据库的结构填充

根据一些建议,我创建并注册了一个NHibernate拦截器来完成这项工作

 public class CustomLineItemInterceptor : EmptyInterceptor
 {

  public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
  {
    var lineItem = entity as SomeCustomLineItem;

    if (lineItem == null)
    return false;


    List<string> propertyNameList = propertyNames.ToList();
    List<IType> typeList = types.ToList();
    List<object> stateList = state.ToList();

    propertyNameList.Add("Source");   // the unmapped column in the database
    typeList.Add(NHibernateUtil.String);
    stateList.Add("My Application's Name");  // the value I need to persist

    state = stateList.ToArray();
    propertyNames = propertyNameList.ToArray();
    types = typeList.ToArray();

    return true;
    }
}
公共类CustomLineItemInterceptor:EmptyInterceptor
{
public override bool OnSave(对象实体、对象id、对象[]状态、字符串[]属性名称、IType[]类型)
{
var lineItem=实体作为SomeCustomLineItem;
如果(lineItem==null)
返回false;
List propertyNameList=propertyNames.ToList();
List typeList=types.ToList();
List stateList=state.ToList();
propertyNameList.Add(“Source”);//数据库中未映射的列
typeList.Add(NHibernateUtil.String);
stateList.Add(“我的应用程序的名称”);//我需要保存的值
state=stateList.ToArray();
propertyNames=propertyNameList.ToArray();
types=typeList.ToArray();
返回true;
}
}
我看了这个,没有找到答案


我所看到的是,我确实启动了OnSave方法,但在数据库(或NHibernate生成的SQL查询)中没有存储任何内容


我做错了什么?

还有一种使用虚拟属性和IPropertyAccessor的方法。我在域模型中的一个项目中使用了它,对我来说,在映射中声明一次比在打开会话的任何地方都要容易,会话发生在几个不同的项目中(应用程序、导入、ETL、其他程序的集成)

还有一种使用虚拟属性和IPropertyAccessor的方法。我在域模型中的一个项目中使用了它,对我来说,在映射中声明一次比在打开会话的任何地方都要容易,这发生在几个不同的项目中(应用程序、导入、ETL、其他程序的集成)

我不太了解NHibernate拦截器的工作原理,但我不认为更改传入的数组变量实际上会更改该方法外部的任何内容。为了使新数组返回到方法之外,需要通过引用(
ref
)参数传递它们


看看你的第一个,跳出的第一个区别是,在他的方法的末尾,他调用了base方法,传入更新的参数(
返回base.OnSave(entity,id,state,propertyNames,types);
)。也许这会有所帮助?

我不太了解NHibernate拦截器是如何工作的,但我不认为更改传入的数组变量实际上会更改该方法外部的任何内容。为了使新数组返回到方法之外,需要通过引用(
ref
)参数传递它们


看看你的第一个,跳出的第一个区别是,在他的方法的末尾,他调用了base方法,传入更新的参数(
返回base.OnSave(entity,id,state,propertyNames,types);
)。也许这会有帮助?

您是否可以访问NHProfiler(如果没有,为什么?)?它向您显示了什么?它显示了在没有添加新参数的情况下执行的查询。为什么不映射此属性
公共虚拟字符串源{get{return“My Application's Name”;}private set{}
?“但是我没有在数据库中存储任何内容”:什么都没有(没有插入没有更新)或者只是没有非映射字段?@dotjoe,因为我不想用遗留数据存储需求污染我的域模型。你有权访问NHProfiler吗(如果没有,为什么?)?它向您显示了什么?它显示了在没有添加新参数的情况下执行的查询。为什么不映射此属性
公共虚拟字符串源{get{return“My Application's Name”;}private set{}
?“但是我没有在数据库中存储任何内容”:什么都没有(没有插入没有更新)或者只是没有非映射字段?@dotjoe,因为我不想用遗留数据存储需求污染我的域模型。谢谢--我确实错过了--但是在添加回那一行之后,我仍然没有看到生成的SQL Insert中的任何更改。谢谢--我确实错过了--但是在添加回那一行之后,我仍然没有看到生成的SQL Insert中的任何更改。好的,这是我最后为让它工作而采取的方法。我仍然很好奇为什么我不能通过拦截器来完成。好吧,这是我最后让它工作的方法。我仍然很好奇为什么我不能通过拦截器来做。