当数据库中已存在子项时,NHibernate Cascade Insert

时间:2014-02-04 09:36:26

标签: c# nhibernate reference parent cascade

我目前正在开发一个C#应用程序,它从Excel工作表中导入数据并将其插入数据库中。为了简化数据层,我使用的是NHibernate。

这是我映射到数据库的两个类:

public class Bus
{
    public virtual string Id { get; set; }
    public virtual Bustype Bustype { get; set; }
}

public class Bustype
{
    public virtual string Id { get; set; }
}

我在总线上的Bustype关联上使用级联。我的问题是,不同Excel工作表中的Bus对象引用相同的BusType。所以当我想插入一个新的总线时,我需要做这样的事情:

  • 如果数据库中不存在BusType,请先插入,然后插入Bus
  • 如果数据库中存在BusType,请在Bus中引用现有的BusType,然后插入Bus

有什么方法可以设置NHibernate来自动执行此操作吗?目前我必须手动检查,但我想避免这种情况,因为这需要额外的努力:

if (busTypeRepository.GetById(b.BusType.Id) == null) {
                busTypeRepository.Insert(b.Bustype);
}

b.Bustype = busTypeRepo.GetById(b.Bustyp.Id);
busRepository.Insert(b);

1 个答案:

答案 0 :(得分:0)

我想说,在这种情况下,您的自定义方法是完全正确的,尽管您的注意事项:

  

目前我必须手动检查,但我想避免这种情况,因为这需要额外的努力

问题,NHIBrante难以管理的问题,在使用引用及其Id(即Bustype时,NHibernate为我们提供的功能中隐藏着这个问题。 }和Bustype.Id

  • 他们确实有Id值== NHibernate期望这样的对象确实存在,不需要INSERT
  • 'Id'与通常预期的“unsaved-value”完全相同。我们可以配置什么是unsaved-value(null,-1,0 ...)但是我们只能有 ONE值来表示transient == unsaved instance。

无论您的问题是关于INSERT的事实,这个记录在案的部分(如果可能的话,请仔细阅读)会给予更多理解:

要点:

如果来自客户端的对象(例如Excel表格)确实有Id预设,无论它们是否持久存在,NHibernate都需要我们的帮助... < / p>