我想知道是否有人可以提供帮助。我有父母/子女关系,父母与孩子有一对一的关系,但孩子可以有很多父母。
父映射:
public sealed class DatumMap : ClassMap<Datum>
{
public DatumMap()
{
Id(x => x.Id);
Map(x => x.DataValue);
References(x => x.MergeField).Cascade.All();
}
}
子映射:
public sealed class MergeFieldMap : ClassMap<MergeField>
{
public MergeFieldMap()
{
ReadOnly();
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.MergeTag);
HasMany(x => x.Data);
}
}
如果我用新的相同孩子创建两个新的分离父母,然后一个接一个地保存它们,我将坚持孩子的两个“副本”,而不是重用现有的子实体。
如果通过查找子类并将其附加到第二个父级,我可以强制重用子类。
我想知道是否有一种更优雅的方式来实现这一目标,这样如果我尝试并坚持本质上相同的子实体,它会使用现有实体,否则会创建一个新的子项。
非常感谢任何帮助。
答案 0 :(得分:0)
如果孩子已经存在,则必须以某种方式执行查找。然而,哪两个孩子是相同的是商业逻辑,这是不同的,因此它不会开箱即用。
// code to save new Parent
Child child = ...
var parent = new Parent { Child = child };
session.Save(parent);
如果相同意味着Id(假设GeneratedBy Assigned)则
Child child = session.Get<Child>(childId);
if (child == null)
child = new Child(childId);
如果你知道孩子已经存在
// will generate a proxy instead of querying
Child child = session.Get<Child>(childId);
如果相同则表示自然ID /密钥
Child child = session.Query<Child>().FirstOrDefault(c => c.UniqueProperty == uniqueProperty);
if (child == null)
child = new Child(childId);