是否可以在多对一中选择单个匹配元素

时间:2015-05-26 12:52:27

标签: c# nhibernate mapping

我有一个拥有拥有类的类,这两个类都可以有版本。

如果我更新了拥有类的版本,我不想创建子类的新版本,所以当我在数据库中保存新版本的所有类时,我希望从子类到仍然是有效的根据拥有级别的主键和这个"类"

的最大版本
public class Child
{
  property Owner Parent { get; set;}
  property int Version { get; set; }   
}

public class Owner 
{
  property Guid Id { get; set; }
  property int Version { get; set; }
  property string Identifier { get; set; }
  property string Namn { get; set; }
}

如果我现在想要选择一个带有nhibernate的子类,并希望自动选择由Identifier属性标识的最新版本的Parent类。由于所有版本具有相同的值,因此该标识符值不是唯一的。 Owner类的Id是用于标识相同元素的不同版本的Guid。

所以我的问题是如何在映射hbm时创建它,这样当它的所有者获得新版本时,不需要对Child类的项进行更新

在sql中,这将类似于

Select * From Child c
Inner Join Owner o on o.Identifier = c.Identifier 
and o.Version = (Select Max(o2.Version) From Owner o2 Where o.Identifier = o2.Identifier)

询问问题是否不清楚

1 个答案:

答案 0 :(得分:0)

提供的sql意味着数据库端没有外键。

具有所需属性的常规方法是将类拆分为固定部分和版本部分。不需要更改引用。

还评估你是否真的需要Guid或者整数类型是否足够

public class Child
{
    property Owner Parent { get; set;}
    property int Version { get; set; }   
}

class Owner
{
    public virtual Guid Id { get; protected set; }
    public virtual string NaturalKey { get; protected set; } // never changes
    public virtual Ilist<OwnerData> Data { get; protected set; }

    public virtual BData ActualData { get { return Data.Last(); } }

    public virtual BData GetActualDataToEdit()
    {
        var newData = ActualData.Clone();
        newData.Version++;
        Data.Add(newData);
        return newData;
    }
}

class OwnerData
{
    public virtual int Version { get; protected set; }
    public OwnerData Clone() { ... }
}

// e.g. FluentNHibernate mapping
mapping.List(x => x.Data, p => p.OrderBy("Version"))