1

我想知道是否有人可以提供帮助。我有一个父母/孩子关系,父母与孩子是一对一的关系,但孩子可以有很多父母。

父映射:

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);
    }
}

如果我创建两个具有新相同孩子的新分离父母,然后一个接一个地保存它们,我将保留孩子的两个“副本”,而不是重用现有的孩子实体。

如果子类存在,我可以通过查找它并将其附加到第二个父类来强制重用它。

我想知道是否有更优雅的方法来实现这一点,这样如果我尝试坚持本质上相同的子实体,它会使用现有实体,否则会创建一个新子实体。

任何帮助将非常感激。

4

1 回答 1

0

如果孩子已经存在,则必须以某种方式执行查找。然而,哪两个孩子相同是业务逻辑不同,因此它不会开箱即用。

// code to save new Parent

Child child = ...

var parent = new Parent { Child = child };

session.Save(parent);

如果相同意味着 Id(假设 GeneratedBy 已分配),则

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/key

Child child = session.Query<Child>().FirstOrDefault(c => c.UniqueProperty == uniqueProperty);
if (child == null)
    child = new Child(childId);
于 2012-06-08T09:40:10.063 回答