0

Iesi.Collections.Generic.ISet<Idea>我有一个从 NHibernate公开集合类型 () 的域实体。该类通过代码通过 NHibernate 映射进行映射。但我不喜欢Iesi.Collections.Generic.ISet<Idea>NHibernate 类型的集合类型。我想用 .Net 集合类型替换它。

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()
    {
        //...
    }
}

任何想法?

4

3 回答 3

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 构建时自动复制到输出文件夹。

荣誉何塞·罗曼尼洛

于 2013-05-14T22:54:31.647 回答
1

您可以替换ISet<T>为 .NET's ICollection<T>,并使用 .NETHashSet<T>而不是 Iesi 对其进行初始化HashedSet<T>

参考Ayende 的博客

如果您不需要设置语义,那么您可以按照 Alex 的回答所建议的那样使用包语义。

于 2013-05-14T19:31:22.513 回答
0

只需使用 system.Collections.Generic 中的 IList<>。我知道这在将集合映射为 NHibernate Bag 时有效。

因为你有一个 ISet,我假设你将集合映射为 NHibernate 集,我不确定它是否也适用。如果可行,那就考虑将集合映射为 Bag。

我们通过 .hbm.xml 映射文件进行映射,所以我不能给你一个在代码中映射 Bag 的例子,但是有很多网站描述了这一点:)

映射 .hbm.xml 示例:

<bag name="Ideas" table="SomeTable" cascade="all-delete-orphan" inverse="true" lazy="false">
        <key column="Id"/>
        <one-to-many class="Idea"/>
    </bag>
于 2013-05-14T19:26:36.850 回答