2010-03-22 66 views
6

非法访问,我发现了错误装载收集错误

到装填回收

非法访问,当我试图让属于某些变型产品的列表。 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> 

我已经尝试过chancing懒惰和逆属性,在这个网站上的其他议题的建议,但他们没有做的伎俩。

我正在使用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

好,非常愚蠢的,但是我终于得到了问题就迎刃而解了。

数据库中的索引列Ordinal没有得到正确的值,因此它总是NULL。这导致了错误,因为NHibernate无法找到索引列来创建列表。

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

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

inverse =“true”是最常用的,因为这意味着另一个端点是在一对多关联中拥有密钥的那个端点(许多端有一个到另一端的外键)。

1

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

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

+0

它也可能是跨产品的情况(请参阅https://www.tutorialspoint.com/sql/sql-cartesian-joins。HTM),你可能会或可能不会想要。 – increddibelly 2017-01-23 10:11:29

0

多对一的属性没有在其他地图类中正确映射,所以它不会带来与其相关的结果。

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

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