是否可以在多对一中选择单个匹配元素?
本文关键字:单个匹 元素 选择 多对一 是否 | 更新日期: 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"))