为现有父级保存子级

时间:2013-07-18 14:44:36

标签: c# .net nhibernate inheritance hql

我有一个带有一些继承的模型,它在数据库上使用nhibernate来持久化。使用流畅的nhibernate的nhibernate映射工作正常,但我有一个场景,我需要为现有父级保存一个孩子。我的模型看起来像这样:

public class Item
{
   public long Id { get; set; }
   public string Name { get; set; }
   // other properties
}

public class ItemCommercial : Item
{
   public decimal Value { get; set; }
   // other properties
} 

在我的数据库中,各个表由Id <-> Id(每个一个)相关联。

我想知道,如何为数据库中的现有ItemCommercial保存一个Item实例。我有项目的ID,但我不知道怎么说nhibernate只说孩子,而是创建一个新项目,样本:

session.Save(itemCommercialObj); // will create a Item and ItemCommercial with the same Id

谢谢。

2 个答案:

答案 0 :(得分:0)

你不能像这样的对象的运行时类型因此NH不支持它。将设计更改为

public class Item
{
    public long Id { get; set; }
    public string Name { get; set; }
    public CommercialValue CommercialValue { get; set; }
    // other properties
}

public class CommercialValue
{
    public Item Item { get; set; }
    public decimal Value { get; set; }
    // other properties
}

和一对一的映射。然后就像设置CommercialValue属性一样简单

答案 1 :(得分:0)

我也是answered here

不,不可能将已经持久化的对象“升级”到其子类。 Nhibernate根本不支持这个。 如果您使用与基类相同的ID来保护子类,则Nhibernate只需创建一个具有该对象的新ID的副本,而不是创建对Member的引用...

所以基本上你可以做任何一次

  1. 将客户数据复制到会员,删除客户并保存会员
  2. 使用不带子类的不同对象结构,其中Member是一个不同的表,其中包含自己的ID和对Customer的引用
  3. 使用本机sql将行插入Member ...