2013-05-14 93 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

相关问题