保存记录时无法在外键中插入null(一对多关系)

时间:2013-08-09 11:40:35

标签: c# nhibernate asp.net-mvc-4

我必须上课和他们之间的一对多关系。

EstimateVersion.cs

private ISet<Template> _templates;
public virtual ISet<Template> Templates
{
    get { return _templates ?? (_templates = new HashedSet<Template>()); }
    set { _templates = value; }
}

Template.cs

public virtual EstimateVersion EstimateVersion { get; set; }

以下是它们之间的关系如何在映射文件中定义:

EstimateVersion.hbm.xml

<set name="Templates" table="EST_TTemplate" cascade="all-delete-orphan" schema="{TRAN_USER}" inverse="true">
  <key column="EstimateVersionId" />
  <one-to-many class="Template" />
</set>

Template.hbm.xml

<many-to-one name="EstimateVersion" class="EstimateVersion" column="EstimateVersionId" />

在我创建EstimateVersion的代码中,这就是我让对象知道它们之间关系的方式。

var version = new EstimateVersion();
//Code that inserts values into the object's properties
Repository.Save(version);
var template = new Template();
//Code that inserts values into the object's properties
Repository.Save(template);
template.EstimateVersion = version;

插入估计版本的查询运行正常,但在插入模板记录时,它会尝试将null插入EstimateVersionId并抛出错误,因为它不可为空。 (我认为如果它可以为空,它会首先将其插入为null,然后使用正确的值更新它。)

我该如何纠正?

1 个答案:

答案 0 :(得分:2)

正如秘密松鼠所说,这些线应该是另一种方式。通过首先在Template对象上设置EstimateVersion,更新将为您保存外键链接,并且不会尝试插入空值。

所以代码示例应为:

var version = new EstimateVersion();
//Code that inserts values into the object's properties
Repository.Save(version);
var template = new Template();
//Code that inserts values into the object's properties
template.EstimateVersion = version;
Repository.Save(template);