我收到了错误
非法访问加载集合
当我想要获取属于某个产品的变体列表时。 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 %>
<%} %>
答案 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);
});