5

我有一个相当复杂的实体,当特定的数据库表缺少记录时,它不会保存。当记录存在时,实体会正确保存。当记录没有我收到异常时:

此 SqlParameterCollection 的索引 N 无效,Count=N

在阅读了通过 Google 找到的一堆解决方案以及 Stack Overflow 上最密切相关的问题之后:

我相信我的问题与我设置映射文件的方式有关。Customer 实体引用了 Person 实体。Person 映射到我们已经读取但没有写入权限的表。当 Person 实体的记录不存在时,我会生成异常。如果记录存在没有问题。我已将 Person 从 customer 的引用设置为Nullable(). 我还仔细检查了以确保我没有从任一实体映射两次的属性。

以下是我觉得相关的映射信息,但可以根据需要提供更多:

顾客

//more mapping code...
References(x => x.Person, "snl_id").Nullable();
//more mapping code...

//more mapping code...
ReadOnly();
Id(x => x.SnlId).Column("SNL_ID");
//more mapping code...

更复杂的是,我们有一些痛苦的代码来让 NHibernate 在 Person 不存在时表现得更好。我不确定它是否适用于此,但认为它足够相关,可以包含在我的问题中。我们使用下面的代码,因为没有它,NHibernate JIRA 将创建大量查询。此Stack Overflow 答案中概述了此解决方案。

客户的个人财产

public virtual Person Person
{
    get
    {
        try
        {
            var snlId = per.Name;
            return per;
        }
        catch
        {
            return null;
        }
    }
    set
    {
        per = value;
    }
}

private EPerson per;

我的映射中缺少什么会导致此异常?我没有看到这个问题的另一个部分吗?

4

2 回答 2

2

虽然 Scott 从 Customer 类中删除 snl_id 属性的解决方案解决了这个问题,但它会导致我无法解决的问题——即使没有相应的 Person 表记录,snl_id 也可以存在于 Customer 表中。既然是这种情况,有时当我无法通过关联的 Person 属性访问 snl_id 时,我将需要访问它。

我考虑了几种替代解决方案,但最终决定创建 Customer 表的视图,包括 Customer 表的主键和来自 customer 表的 snl_id。然后通过连接将该属性映射到视图。

Join("v_cust_id_snl_id", j => j.KeyColumn("cust_id").Map(x => x.SnlId, "snl_id")

这种变化让我可以吃蛋糕。我能够保留客户的 SnlId 属性,但在保存时不再抛出异常。

于 2011-09-30T17:44:39.527 回答
1

您是否将 snl_id 作为 Customer 中的属性引用以及作为子对象的主键?如果是这样,这将导致您收到错误。从 Customer 中删除属性并使用 Person 获取值。

于 2011-09-28T15:07:35.757 回答