2011-02-04 114 views
4

道歉,如果有一個在線答案已經出現在那裏,但我還沒有找到它。我使用NH3,並且我有一個用例,我想將Set添加到任何實現類的實現特定接口的實體中。我有一個配置生成器類,所以我可以在創建會話工廠之前進行這些更改。在運行時擴展/修改NHibernate類

鑑於這種減少的例子:

public class Person : IHasExtraItems 
{ 
    public Person() 
    { 
     this.ExtraItems = new HashSet<ExtraItem>(); 
    } 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime Birthdate { get; set; } 
    public virtual ICollection<ExtraItem> ExtraItems { get; protected set; } 
} 

public class ExtraItem 
{ 
    public virtual Guid Id { get; set; } 
} 

而這種映射的例子:

<class name="Person"> 
    <id name="Id"> 
     <generator class="guid"/> 
    </id> 
    <property name="Name"/> 
    <property name="Birthdate"/> 
    <set name="Extra" table="PersonExtraItems" cascade="all"> 
     <key column="PersonId"/> 
     <many-to-many column="ExtraItemId" class="ExtraItem" unique="true" /> 
    </set> 
    </class> 

因爲我希望能夠將此功能透明地應用於許多類 - 只是通過實現界面 - - 我不想將「ExtraItem」放入映射中。相反,我想在運行時添加它。所以如果我從xml映射中刪除屬性,我怎麼能在運行時添加這個屬性?

有這個準確描述的變化,我試圖讓類型: http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx

但它並沒有很多映射到多臺,我的大腦微弱一直無法破譯內存映射表示nhibernate用來創建效果。這是我來最接近的基礎上,試圖讓在調試可見性,以匹配

foreach (var cls in cfg.ClassMappings) 
{ 
    if (typeof(IHasExtraItems).IsAssignableFrom(cls.MappedClass)) 
    { 
     NHibernate.Mapping.Property property = new NHibernate.Mapping.Property(); 
     NHibernate.Mapping.Set value = new NHibernate.Mapping.Set(cls); 
     value.Role = cls.EntityName + ".ExtraItems"; 
     value.IsGeneric = true; 
     var table = new Table(); 
     table.Name = cls.MappedClass.Name + "ExtraItems"; 
     value.CollectionTable = table; 
     value.GenericArguments = new Type[] { typeof(ExtraItem) }; 
     value.IsOptimisticLocked = true; 
     value.IsLazy = true; 
     mappings.AddCollection(value); 
     property.Value = value; 

     property.Name = "ExtraItems"; 
     property.PersistentClass = cls; 
     property.Cascade = "all"; 
     cls.AddProperty(property); 
    } 
} 

在測試中,由於該鍵爲null,但是XML映射版本的作品這將產生一個運行時錯誤,並且在我進行更改時看起來或多或少是相同的。

積分:我想多對多,因爲我想要一個連接表。這讓我可以將實體映射到具有真正外鍵的擴展數據以獲得性能。 ExtraItems實際上應該是一個值類型而不是一個真正的實體,但我無法弄清楚如何映射它,即使是在XML中。

積分,第2部分:我可以用confORM來做這個嗎?我不想將所有現有的映射切換爲confORM,並且我找不到將傳統XML映射混合使用的示例,從不修改現有映射。 Fluent將是另一種選擇,但我使用NH3,但我不認爲Fluent支持。

在此先感謝!

編輯我很確定我的問題是我沒有定義該組的元素。但是,我無法辨別如何正確定義該集合的元素。

回答

1

有NH3流利的構建,所以你可以使用它(我這樣做),如果你使用流利你可以很容易地做到這一點與一個約定。你在獎勵積分部分提到,或許你應該再看一次?