我目前正在开发一个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。所以当我想插入一个新的总线时,我需要做这样的事情:
有什么方法可以设置NHibernate来自动执行此操作吗?目前我必须手动检查,但我想避免这种情况,因为这需要额外的努力:
if (busTypeRepository.GetById(b.BusType.Id) == null) {
busTypeRepository.Insert(b.Bustype);
}
b.Bustype = busTypeRepo.GetById(b.Bustyp.Id);
busRepository.Insert(b);
答案 0 :(得分:0)
我想说,在这种情况下,您的自定义方法是完全正确的,尽管您的注意事项:
目前我必须手动检查,但我想避免这种情况,因为这需要额外的努力
问题,NHIBrante难以管理的问题,在使用引用及其Id
(即Bustype
时,NHibernate为我们提供的功能中隐藏着这个问题。 }和Bustype.Id
)
Id
值== NHibernate期望这样的对象确实存在,不需要INSERT unsaved-value
”完全相同。我们可以配置什么是unsaved-value(null,-1,0 ...)但是我们只能有 ONE值来表示transient == unsaved instance。无论您的问题是关于INSERT的事实,这个记录在案的部分(如果可能的话,请仔细阅读)会给予更多理解:
如果来自客户端的对象(例如Excel表格)确实有Id
预设,无论它们是否持久存在,NHibernate都需要我们的帮助... < / p>