簡體   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