[英]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.