> 文章列表 > 利用nhibernate实现操作实体类就能删除从表记录

利用nhibernate实现操作实体类就能删除从表记录

利用nhibernate实现操作实体类就能删除从表记录

一个使用NHibernate的ORM对象,对应数据库一张主表(或曰父表),然后里面又对应了多条表记录(或曰子表),如下所示

1、包含一对多关系的实体类

public class Yb_Hl_Base_SzMap : ClassMap<Yb_Hl_Base_Sz>
{public Yb_Hl_Base_SzMap(){Table($"{TableSpace.Source}Yb_Hl_Base_Sz");Id(s => s.ID).GeneratedBy.Sequence($"{TableSpace.Source}SEQ_Yb_Hl_Base_Sz");Map(s => s.YBTYPE);Map(s => s.DISTANCE);Map(s => s.YBDATE1);Map(s => s.YBDATE2);HasMany(s => s.Details).KeyColumn("Master_Id").Inverse().Cascade.All().LazyLoad().NotFound.Ignore();}
}

其中,Details就是从表记录集。

众所周知,ORM框架的出现,就是为了简化程序员对数据库进行操作。比如说,有了这个NHibernate,像上面这个例子,我们新增一条主表记录以及相应多条从表记录就很方便了。我只要

2、插入实体类

Yb_Hl_Base_Sz sz = new Yb_Hl_Base_Sz()
{Details = new List<Yb_Hl_Base_Sz_Detail>()
};//相关实体类
foreach(var detail in details)
{sz.Details.Add(detail);
}
。。。
Yb_Hl_Base_SzRepository repository;//相关仓库类
。。。
repository.Add(sz);

即可完成新增一条主记录和若干条从记录,方便又快捷。

3、更新实体类

但假如是更新呢?比如从表记录删除了原来的记录,然后插入新记录,该怎么做?很自然地,也是希望通过操作实体类,然后更新实体类来达成:

Yb_Hl_Base_Sz sz = 从数据库中获取sz.Details.Clear();//先清掉现有子表记录
foreach(var detail in details)//然后插入新子表记录
{sz.Details.Add(detail);
}
。。。
Yb_Hl_Base_SzRepository repository;//相关仓库类
。。。
repository.Update(sz);

问题是,这样的结果,就是从表旧的记录没有删除,同时插入了新记录。

如果想实现删除旧记录,映射类应该这样写:

public class Yb_Hl_Base_SzMap : ClassMap<Yb_Hl_Base_Sz>
{public Yb_Hl_Base_SzMap(){Table($"{TableSpace.Source}Yb_Hl_Base_Sz");Id(s => s.ID).GeneratedBy.Sequence($"{TableSpace.Source}SEQ_Yb_Hl_Base_Sz");Map(s => s.YBTYPE);Map(s => s.DISTANCE);Map(s => s.YBDATE1);Map(s => s.YBDATE2);HasMany(s => s.Details).KeyColumn("Master_Id").Inverse()//.Cascade.All().Cascade.AllDeleteOrphan().LazyLoad().NotFound.Ignore();}
}

用 .Cascade.AllDeleteOrphan() 来代替 .Cascade.All()。Orphan,孤儿的意思,顾名思义。

参考文章:
https://stackoverflow.com/questions/31596622/deleting-child-objects-in-hasmany-nhibernate-relationship