如何在不实现NHibernate.Collection的情况下映射我的自定义集合实现IEnumerable与Fluent NHibernate?

时间:2011-03-30 13:41:05

标签: nhibernate collections fluent-nhibernate nhibernate-mapping

我们使用自定义集合类来保存我们的实体集合,但是我遇到了映射Fluent NHibernate的集合属性的问题。我已阅读本网站上所有类似主题的帖子,但似乎都没有解决我们的特殊情况。

我们模型的典型集合类是:

public class ElementList : IEnumerable<Element>
{
    private List<Element> list = new List<Element>();
    public ElementList(IEnumerable<Element> elements)
    {
        this.list.AddRange(elements);
    }
    protected ElementList() {}
    protected List<Element> InternalList
    {
        get { return this.list; }
        set { this.list = value; }
    }
    public IEnumerator<Element> GetEnumerator()
    {
        return this.list.GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

这是父对象的属性:

public class Paragraph
{
    private ElementList elements;
    public Paragraph(params Element[] elements)
    {
        this.elements = new ElementList(elements.ToList());
    }
    protected Paragraph()
    {
    }
    public virtual int Id { get; protected set; }
    public virtual ElementList Elements
    {
        get { return this.elements; }
        protected set { this.elements = value; }
    }
}

我尝试将其映射如下:

public ParagraphMap()
{
    this.Id(x => x.Id);
    Component(
            x => x.Elements,
            m => m.HasMany<Element>(Reveal.Member<ElementList>("InternalList")).AsSet().KeyColumn("ParagraphId"));
}

当我创建我的存储库并且按照我期望的方式创建表时,这很好。问题是当我尝试添加Paragraph对象时。以下代码抛出InvalidCastException,因为我无法将类型为'NHibernate.Collection.Generic.PersistentGenericSet [Element]'的对象强制转换为'System.Collections.Generic.List [Element]':

var elements = new Element[] { new Element(), new Element() };
var paragraph = new Paragraph(elements);

using (var unitOfWork = this.repository.Begin())
{
    this.repository.Add(paragraph);
}

我做错了什么?

我已经注意到很多帖子说最好不要使用自定义集合,但这样做是我们项目的标准,所以我希望坚持下去并让它发挥作用。

1 个答案:

答案 0 :(得分:1)

我认为您的自定义集合还需要实现IList<Element>ICollection<Element>。可能是ICollection,因为它是一个集合。