利用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