【问题标题】:Fluent NHibernate One-To-One -> One-To-Many RelationshipFluent NHibernate 一对一 -> 一对多关系
【发布时间】:2012-06-08 17:40:10
【问题描述】:

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

父映射:

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

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

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

    Child child = session.Query<Child>().FirstOrDefault(c => c.UniqueProperty == uniqueProperty);
    if (child == null)
        child = new Child(childId);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多