非法访问加载集合错误

时间:2010-03-22 15:19:24

标签: nhibernate c#-3.0 nhibernate-mapping mapping collections

我收到了错误

  

非法访问加载集合

当我想要获取属于某个产品的变体列表时。 NHibernate映射如下所示

<list name="Variants" lazy="false" cascade="save-update" inverse="false" table="PluginProduct_ProductVariant">
  <key column="ProductId" />
  <index column="Ordinal" />
  <one-to-many class="Plugin.Product.Business.Entities.Variant, Plugin.Product" />
</list>

我已经尝试过按照本网站其他主题的建议来调整懒惰和反向属性,但他们并没有这样做。

我正在将NHibernate与ASP.NET MVC结合使用,并且我试图在我的视图中循环遍历一个变体集合。视图调用以下方法

        public ActionResult ShowProduct()
        {
        var id = new Guid(PluginData.PageParameters["Id"]);

        var variant = _variantService.GetVariantById(id);
        var product = variant.Product;

        return PluginView("ShowProduct.ascx", product);
        }

上面的代码运行没有任何问题。但是当我在返回视图之前调试时,我看到产品包含的变体列表是空的。当我打开更详细的调试信息时,它会向我显示收集错误。

在我的网络应用程序视图中,我正在尝试执行以下操作

<%
foreach (var variant in Model.Variants)
{%>
    kleur: <%= variant.Color %>
    van: <%= variant.FromPrice %> voor: <%= variant.Price %>
<%} %>

5 个答案:

答案 0 :(得分:5)

好的,非常愚蠢,但我终于解决了问题。

数据库中的索引列Ordinal未获取正确的值,因此始终为NULL。这导致了错误,因为NHibernate无法找到索引列来创建列表。

不幸的是,花了我很多时间,但很高兴我解决了它!

答案 1 :(得分:2)

问题解决了!我遇到了另一个问题,添加了一个带有变体的产品,所以我在我的控制器中更改了这个智能。然后我遇到了映射的问题,所以我改变了下面的映射,这一切都有效!

    <list name="Variants" lazy="false" cascade="all" inverse="false">
  <key column="ProductId" />
  <index column="Ordinal" />
  <one-to-many class="Plugin.Product.Business.Entities.Variant, Plugin.Product" />
</list>

答案 2 :(得分:2)

inverse =“true”是最常用的,因为它意味着另一个端点是一对多关联中具有密钥的端点(多方具有一侧的外键)。

答案 3 :(得分:1)

我遇到了这个问题,这不是映射问题,但实际上是一个数据问题。 我们收集的数据太多了,但我们得到了这个例外而不是更有用的东西。

我希望我的收藏包含10-15条记录,但它有大约400万条记录。

答案 4 :(得分:0)

多对一属性未在另一个地图类中正确映射,因此不会将结果与其相关联。

基本上我删除了这一行:map.PropertyRef("Codigo"); 它运作正常。

 ManyToOne(x => x.Menu, map => 
            {
                    map.Column("COD_MENU");
                    //map.PropertyRef("Codigo");
                    map.NotNullable(true);
                    map.Cascade(Cascade.None);
            });