流利的NHibernate一对一 - >一对多的关系

时间:2012-05-31 15:31:12

标签: nhibernate fluent-nhibernate

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

父映射:

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

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

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

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

非常感谢任何帮助。

1 个答案:

答案 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);