【问题标题】:C# - NHibernate unable to cast NHibernate.Collection.Generic.PersistentGenericSet to System.Collections.Generic.IListC# - NHibernate 无法将 NHibernate.Collection.Generic.PersistentGenericSet 转换为 System.Collections.Generic.IList
【发布时间】:2012-09-25 11:23:55
【问题描述】:

由于某种原因,当我尝试从数据库中获取数据时,NHibernate 告诉我它无法将 NHibernate.Collection.Generic.PersistentGenericSet[Ingredient] 转换为 System.Collection.Generic.IList[Ingredient]。这是我的类映射/实现的简化版本:

public class Product {
    protected Product() { };

    public virtual Name { get; set; }
    public virtual IList<Ingredient> {
        get { return new List<Ingredient>(ingredients).AsReadOnly(); }
        protected set { ingredients = value; }
    }

    private IList<Ingredient> ingredients = new List<Ingredient>();
}

--

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="LanchesAdmin.Core.Domain.Product, LanchesAdmin.Core" table="product" >
        <id name="ID" generator="identity">
            <column name="id" not-null="true" />
        </id>

        <property name="Name" column="name" length="64" not-null="true" />

        <set name="Ingredients" table="ingredient" fetch="join" lazy="true" inverse="true">
            <key column="product_id" />
            <one-to-many class="LanchesAdmin.Core.Domain.Ingredient, LanchesAdmin.Core" />
        </set>
    </class>
</hibernate-mapping>

我看过几个相关的问题,但他们都告诉我使用 IList,而这正是我正在做的。

【问题讨论】:

  • 尝试删除新列表的创建和 ReadOnly 调用。
  • @Euphoric,试过了,没啥区别。
  • @Raphael_ 你能发布你最终工作的代码吗?如果可能的话,您能否发布Ingredient 的代码(或解释它是什么)。我遇到了一个问题,想知道您的解决方案是否能解决它。提前致谢。
  • @REMESQ 这是整个项目:dropbox.com/s/kgfha79lr6yz6cy/LanchesAdmin.rar 映射和实现应该在LanchesAdmin.Core/Domain 上。 PS:这是相当业余的代码,但我希望它能给你一些启发。
  • 感谢您的启发!

标签: c# mysql nhibernate


【解决方案1】:

您想要清单、包还是套装?您的域模型包含 IList&lt;T&gt;,但您已将其映射为 &lt;set&gt;。

要么将您的映射更改为&lt;bag&gt; 或&lt;list&gt;,要么将您的域模型更改为使用ISet&lt;T&gt;。

【讨论】:

  • 您能检查一下您的答案吗?我想你漏掉了一些字。
【解决方案2】:

将属性的类型从 IList 更改为 ISet。

或将映射从 &lt;set&gt; 更改为 &lt;list&gt;。

【讨论】:

    【解决方案3】:

    原因是您使用的是集合。而PersistentGenericSet&lt;T&gt; 根本没有实现IList&lt;T&gt; 接口。

    我认为您应该简单地创建IEnumerable&lt;Ingredient&gt; 类型的属性。
    这解决了两个问题:

    1. 你摆脱了你提到的错误
    2. 您的类的 API 直接传达您的类的消费者不允许通过该属性添加成分。

    【讨论】:

    • 我已经让它与 ICollection 一起使用,IEnumerable 是否更好?
    • @Raphael_:是的,ICollection&lt;T&gt; 看起来用户仍然可以通过此属性添加项目。 IEnumerable&lt;T&gt; 相反是一个只读接口。这就是你想要的。
    • 我希望能够通过公共方法从我的班级内部向此集合添加/删除项目。
    • 没关系。您仍然可以将 字段 保留为 IList&lt;T&gt; 或 ICollection&lt;T&gt;。
    猜你喜欢
    • 2017-07-05
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2017-11-11
    相关资源
    最近更新 更多