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

本文关键字:单个匹 元素 选择 多对一 是否 | 更新日期: 2023-09-27 17:50:52

我有一个类,它有一个所属类,这两个类都可以有版本。

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

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属性标识的父类的最新版本。这个标识符值不是唯一的,因为所有版本都有相同的值。Owner类的Id是标识同一元素的不同版本的Guid。

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

在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)

问问题是否不清楚

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

提供的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"))