消除域实体中的NHibernate集合类型

本文关键字:NHibernate 集合 集合类 类型 实体 | 更新日期: 2023-09-27 18:13:26

我有一个域实体,从NHibernate公开一个集合类型(Iesi.Collections.Generic.ISet<Idea>)。类通过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()
    {
        //...
    }
}

任何想法?

消除域实体中的NHibernate集合类型

你可以用。net的ICollection<T>代替ISet<T>,用。net的HashSet<T>代替Iesi的HashedSet<T>来初始化它。

参考Ayende的博客。

如果你不需要集合语义,那么你可以像Alex的回答建议的那样使用包语义

您可以按照本文操作:

http://nhforge.org/blogs/nhibernate/archive/2011/03/15/using - lt -设置- gt - - -不- iesi集合映射网- 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

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

因为你有一个isset,我假设你将集合映射为一个NHibernate Set,我不确定它是否也能工作。

我们通过.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>