代码之家  ›  专栏  ›  技术社区  ›  Rob

非法访问加载集合错误

  •  10
  • Rob  · 技术社区  · 14 年前

    我得到了错误

    非法访问加载集合

    当我试图得到某个产品的变体列表时。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);
            }
    

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

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

    <%
    foreach (var variant in Model.Variants)
    {%>
        kleur: <%= variant.Color %>
        van: <%= variant.FromPrice %> voor: <%= variant.Price %>
    <%} %>
    
    5 回复  |  直到 8 年前
        1
  •  5
  •   Kevin Panko Matthew Woodard    8 年前

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

    索引列 Ordinal 数据库中的值不正确,因此 NULL . 这导致了错误,因为nhibernate找不到要在其上创建列表的索引列。

    很不幸,我花了很多时间,但很高兴我解决了这个问题!

        2
  •  2
  •   Rob    14 年前

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

        <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>
    
        3
  •  2
  •   Ricardo Peres    13 年前

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

        4
  •  1
  •   Kevin Panko Matthew Woodard    8 年前

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

    我原以为我的藏品里有10到15张唱片,但却有400万张唱片。

        5
  •  0
  •   Daniel    10 年前

    多对一属性在另一个映射类中没有正确映射,因此它不会带来与之相关的结果。

    基本上我删除了这行: map.PropertyRef("Codigo"); 而且工作正常。

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