我们使用自定义集合类来保存我们的实体集合,但是我遇到了映射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);
}
我做错了什么?
我已经注意到很多帖子说最好不要使用自定义集合,但这样做是我们项目的标准,所以我希望坚持下去并让它发挥作用。
答案 0 :(得分:1)
我认为您的自定义集合还需要实现IList<Element>
或ICollection<Element>
。可能是ICollection,因为它是一个集合。