仅当关联表具有空记录时,此SqlParameterCollection的索引N无效且Count = N.

时间:2011-09-27 22:02:59

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

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

  

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

阅读了一系列通过Google发现的解决方案以及Stack Overflow上最密切相关的问题:

我认为我的问题与我的映射文件设置方式有关。 Customer实体引用了Person实体。 Person映射到我们已读过但不能写入的表。当Person实体的记录不存在时,我生成异常。如果记录不存在问题。我已将客户的参考设置为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 answer中列出。

客户的财产

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

private EPerson per;

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

2 个答案:

答案 0 :(得分:2)

虽然Scott从Customer类中删除snl_id属性的解决方案修复了问题,但它导致我无法解决的问题 - 即使没有相应的Person表记录,snl_id也可以存在于Customer表中。因为在这种情况下,当我无法通过关联的Person属性访问snl_id时,我需要访问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属性保留在客户身上,但在保存时不再抛出异常。

答案 1 :(得分:1)

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