如果在不扩展具有特殊属性的域类的情况下通过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" />
我的拦截器类有方法:
public bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
在那一刻甚至可能在保存之前我必须向DB Customer表添加额外的2列(例如,计算机名称和用户名)propertyNames[]
和state[]
参数没有它们从一开始,所以应该在飞行中完成。
MY DB Customer表包含我上面描述的所有列。
谢谢。
答案 0 :(得分:1)
我没有尝试过,但您应该能够在创建工厂之前将动态属性添加到配置中。然后,您可以在拦截器中填充这些值。
Ex,从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);
}