ahs*_*ele 5 nhibernate fluent-nhibernate fluent-nhibernate-mapping
我有一个相当复杂的实体,当特定数据库表缺少记录时,它不会保存.当记录存在时,实体正确保存.当记录没有我收到例外时:
具有Count = N的此SqlParameterCollection的索引N无效
阅读了通过Google发现的一系列解决方案以及Stack Overflow上最密切相关的问题:
我相信我的问题与我的映射文件设置方式有关.Customer实体引用了Person实体.Person映射到我们已读过但不能写入的表.当Person实体的记录不存在时,我生成异常.如果记录不存在问题.我已将客户的参考设置为Nullable()
.我也进行了双重检查以确保我没有从任一实体映射两次的属性.
以下是我认为的相关映射信息,但可以根据需要提供更多信息:
顾客
//more mapping code...
References(x => x.Person, "snl_id").Nullable();
//more mapping code...
Run Code Online (Sandbox Code Playgroud)
人
//more mapping code...
ReadOnly();
Id(x => x.SnlId).Column("SNL_ID");
//more mapping code...
Run Code Online (Sandbox Code Playgroud)
为了使问题进一步复杂化,我们有一些痛苦的代码使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;
Run Code Online (Sandbox Code Playgroud)
我的映射中缺少什么会导致此异常?我还没有看到这个问题的另一部分吗?
虽然 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")
Run Code Online (Sandbox Code Playgroud)
这个改变让我鱼与熊掌兼得。我能够保留客户的 SnlId 属性,但在保存时不再抛出异常。
归档时间: |
|
查看次数: |
2211 次 |
最近记录: |