繁体   English   中英

NHibernate IInterceptor实现(向原始域类没有的DB表添加属性)

[英]NHibernate IInterceptor implementation(add properties to DB table that original domain class doesn't have)

当通过NHibernate更新/插入实体而不扩展具有特殊属性的域类时,如何设置一些特殊的列值?

例如:在我的情况下,我希望获得对象,并在更新/插入db之前,通过使用IInterceptor向该对象添加一些其他信息(如用户ID或计算机名称)。 换句话说,我想在DB Table中添加几列而不在原始对象的类中指定新属性。 在这种情况下,我是否必须配置/更改/添加到我的Object.hbm.xml或App.config?

问题是我无法更改我的原始对象和基类。所以我必须弄清楚是否有可能在不更改原始对象的情况下向DB表添加信息(甚至没有从任何基类继承)

例:

原始对象具有: FirstName ,LastName,Birthday,Address properties

Customer.hbm.xml具有:

<property name="FirstName" column="FirstName" type="string" not-null="true" length="64" />
<property name="LastName" column="LastName" type="string" not-null="true" length="64" />
<property name="Birthday" column="Birthday" type="DateTime" not-null="true"  />
<property name="Address" column="Address" type="string" not-null="true"  />

我的Interceptor类有方法:

public bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)

在那一刻甚至可能在保存之前我必须向DB Customer表添加另外2列(例如计算机名和用户名),即propertyNames[]state[]参数从一开始就没有它们,所以应该在飞行中完成。

MY DB Customer表包含我上面描述的所有列。

谢谢。

我没有尝试过,但您应该能够在创建工厂之前将动态属性添加到配置中。 然后,您可以在拦截器中填充这些值。

例如,从config.ClassMappings中检索相关的PersistentClass,然后将属性添加到它。

private void AddProperty(
        PersistentClass pc, 
        string propertyName, 
        string columnName, 
        IType dataType)
    {
        SimpleValue val = new SimpleValue(pc.Table);
        Column col = new Column(dataType, 0);
        col.Name = columnName;
        val.AddColumn(col);
        val.Type = dataType;
        Property prop = new Property(val);
        prop.IsUpdateable = true;
        prop.Name = propertyName;
        prop.PropertyAccessorName = "nosetter.camelcase";
        prop.Cascade = "none";
        pc.AddNewProperty(prop);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM