Как я могу сопоставить свою собственную коллекцию, реализующую IEnumerable, с Fluent NHibernate без реализации NHibernate.Collection? - PullRequest
0 голосов
/ 30 марта 2011

Мы используем пользовательские классы коллекций для хранения наших коллекций сущностей, но у меня возникла проблема с отображением свойств коллекции для 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 Ответ

1 голос
/ 30 марта 2011

Я думаю, что ваша пользовательская коллекция также должна реализовывать IList<Element> или ICollection<Element>.Вероятно, ICollection, как это множество.

...