我在WCF中使用NHibernate 3.1.0.4000和AutoMapper 2.0.0.0。我有一个父母与孩子的关系,我想从“很多”结束。如果我从“一”端完成维护对象,我没有问题,但在这种情况下没有意义。我的问题是无论我如何更改我的映射,POCO等,当我尝试添加子项时,父对象在子项中为null,导致插入失败。为了让孩子的父属性得到填充,我错过了什么? 我在下表中定义了父子关系:
Create Table Attribute (AttributeUID uniqueidentifier, LongName varchar(20))
Create Table AnswerOption (AnswerOptionID int, AttributeUID uniqueidentifier)
我希望Attribute(父)是所有者,因此我在该映射文件中声明关系,而不是在AnswerOption(child)中。虽然,我已尝试过双向关系,并且在我的测试中没有改变任何行为。我的映射如下。属性:
<class name="RCAttribute" table="rcs.tblAttribute">
<cache usage="read-write"/>
<id name="ID">
<column name="AttributeUID" />
<generator class="guid" />
</id>
<property name="LongName" type="string" not-null="true" length="200" column="LongName" />
<bag name="AnswerOptions" lazy="true" inverse="true" cascade="all">
<key column="AttributeUID"/>
<one-to-many class="AnswerOption" />
</bag>
</class>
AnswerOption:
<class name="AnswerOption" table="rcs.tblAnswerOption" lazy="true">
<cache usage="read-write"/>
<id name="ID">
<column name="AnswerOptionID" />
<generator class="native" />
</id>
</class>
属性类:
[Serializable]
public class RCAttribute
{
public virtual Guid ID { get; set; }
public virtual string LongName { get; set; }
public virtual ICollection<AnswerOption> AnswerOptions { get; set; }
public RCAttribute() { ID = new Guid("00000000-0000-0000-0000-000000000000"); }
}
AnswerOption Class:
[Serializable]
public class AnswerOption
{
public virtual int ID { get; set; }
public AnswerOption() { ID = 0; }
}
我的测试程序看起来像这样;
public void CreateAnswerOption()
{
AnswerOption newOpt = new AnswerOption();
Attribute.AnswerOptions.Add(newOpt);
Attribute = rc.RCAttributeSave(Attribute);
}
当创建它时,AnswerOption的Attribute属性为null,因此无法插入,因为在这种情况下父节点中的父节点不能为空。我错过了什么来填充子项上的父属性并能够插入?
答案 0 :(得分:3)
将集合映射为反向而不映射另一侧的多对一映射是没有意义的。
您有三种选择:
inverse="true"
的双向映射,并在保存孩子之前在代码中设置多对一的属性(父级引用)(是的,我读过你不想做的事情)就这样)。not-null="true"
添加到集合映射中的key
标记。然后NHibernate将插入已设置父ID的子项。