2013-05-14 88 views
0

我有一個域實體公開NHibernate的集合類型(Iesi.Collections.Generic.ISet<Idea>)。該類通過代碼通過NHibernate映射進行映射。但我不喜歡收集類型,Iesi.Collections.Generic.ISet<Idea>,這是一種NHibernate類型。我想用.Net集合類型替換它。消除域實體中的NHibernate集合類型

public class Person 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Iesi.Collections.Generic.ISet<Idea> Ideas { get; protected set; } 
} 

public class PersonMap : ClassMapping<Person> 
{ 
    public PersonMap() 
    { 
     //... 
    } 
} 

有什麼想法嗎?

回答

1

您可以使用.NET的ICollection<T>更換ISet<T>,並與.NET HashSet<T>,而不是Iesi填入HashedSet<T>初始化。

參考Ayende's blog

如果你不需要設置語義,那麼你可以使用袋子的語義,如亞歷克斯的答案所示。

0

只需使用system.Collections.Generic中的IList <>。 我知道這適用於將集合映射爲NHibernate Bag。

因爲U有一個ISet,我假設你將集合映射爲一個NHibernate集合,我不確定它是否也適用於此集合。 如果它起作用,那麼可以考慮將集合映射爲Bag。

我們會通過的.hbm.xml映射映射文件,所以我不能給ü代碼映射袋的例子,但也有很多網站是discribe說:)

映射的.hbm.xml例如:

<bag name="Ideas" table="SomeTable" cascade="all-delete-orphan" inverse="true" lazy="false"> 
     <key column="Id"/> 
     <one-to-many class="Idea"/> 
    </bag> 
+0

Thanks!是您提供一對多關係的xml代碼。什麼是inverse =「true」呢?我必須始終在另一側指定「多對一」。 – Pingpong 2013-05-15 01:19:13

+0

根據你的關係,你可以**將'Idea'映射爲一對一的情況,以防萬一'Idea'總是屬於一個特定的'Person',並且不能通過多個'Person'共享。如果你創建了這個關係,你應該爲'創意'類添加一個屬性'人',這樣'創意'類就知道它是誰的父母。如果不這樣做,級聯不起作用。 (刪除父母時刪除孩子)。我說你可以創建這個關係,因爲這個關係不一定存在它的工作。 – 2013-05-15 06:05:16

1

你可以通過本文以下內容:

http://nhforge.org/blogs/nhibernate/archive/2011/03/15/using-lt-set-gt-in-mappings-without-iesi-collections-net-4.aspx

如果你不想使用NuGet包則:

1)複製粘貼此代碼。我認爲這是在nugetpackage https://gist.github.com/mynkow/5580319

2)複製粘貼此配置,當你配置會話工廠一樣的一個:

cfg.Properties[NHibernate.Cfg.Environment.CollectionTypeFactoryClass] = typeof(Net4CollectionTypeFactory).AssemblyQualifiedName; 

3)拆下​​裝配參考Iesi填入。您仍然需要它,但它會在使用NHibernate.dll生成時自動複製到輸出文件夾。

Kudos Jose Romaniello

相關問題