当前位置: 首页 > 编程语言 > C#

NHibernate:保存瞬态实例时如何更新身份ID?分享

时间:2023-04-11 03:33:10 C#

NHibernate:保存瞬态实例时IdentityID是如何更新的?如果我使用session-per-transaction并调用:session.SaveOrUpdate(entity)更正:session.SaveOrUpdateCopy(entity)..andentity是identity-Id=0的瞬态实例。上面的行会自动更新实体的Id,并使实例持久化吗?还是应该在transaction.Commit上执行?还是我必须以某种方式明确编码?显然,数据库行的Id(新的,因为transient)是自动生成并保存为一些数字的,但我这里说的是实参实例。这是业务逻辑实例。编辑-跟进,相关问题。映射:publicclassStoreMap:ClassMap{publicStoreMap(){Id(x=>x.Id).GeneratedBy.Identity();地图(x=>x.Name);HasMany(x=>x.Staff)//1:m.Cascade.All();HasManyToMany(x=>x.Products)//m:m.Cascade.All().Table("StoreProduct");}}publicclassEmployeeMap:ClassMap{publicEmployeeMap(){Id(x=>x.Id).GeneratedBy.Identity();地图(x=>x.FirstName);地图(x=>x.LastName);引用(x=>x.Store);//m:1}}publicclassProductMap:ClassMap{publicProductMap(){Id(x=>x.Id).GeneratedBy.Identity();地图(x=>x.Name).Length(20);Map(x=>x.Price).CustomSqlType("十进制").Precision(9).Scale(2);HasManyToMany(x=>x.StoresStockedIn).Cascade.All().Inverse().Table("StoreProduct");}}EDIT2类定义:publicclassStore{publicintId{get;私有集;}公共字符串名称{得到;放;}publicIListProducts{get;放;}publicIListStaff{get;放;}publicStore(){Products=newList();工作人员=新名单();}//AddProduct&AddEmployee是必需的。“NH需要您先设置两边//它将正确保存”publicvoidAddProduct(Productproduct){product.StoresStockedIn.Add(this);.添加(产品);}publicvoidAddEmployee(员工雇员){employee.Store=this;Staff.Add(员工);}}publicclassEmployee{publicintId{get;私有集;}publicstringFirstName{get;放;}publicstringLastName{get;放;}publicStoreStore{get;放;}}publicclassProduct{publicintId{get;私有集;}公共字符串名称{得到;放;}publicdecimalPrice{get;放;}publicIListStoresStockedIn{get;私有集;就您的问题而言,每当您刷新会话时,您的实体都会保存到数据库中保存(新)实体时,NHibernate使用生成器为您生成ID。请记住,身份生成器已被弃用(请参阅Ayende的这篇文章)。使用身份生成器时,新实体会在保存时持久保存到数据库中,即使它们没有刷新到数据库中也是如此。发生这种情况的原因是因为NHibernate需要为您提供实体的ID,如果不往返数据库,它就无法做到这一点。如果您想要“正常”值,更好的解决方案是使用类似Guid生成器或HiLo的东西。通过这种方式,您可以在不实际进行数据库往返的情况下保存实体,这对于提高性能来说更好(记住批处理)。我不确定我是否理解你的问题。当会话被刷新时(例如,通过提交事务),实际保存到数据库就完成了。调用SaveOrUpdate()本身并不保存实体,只是在会话刷新时通知会话要保存实体。假设实体的ID映射到数据库中的身份字段,并且您的映射告诉NHibernate身份由数据库设置,那么数据库集ID将在保存时设置为实体的ID。Nhibernate将在调用SaveOrUpdate之后设置实体的ID属性。我注意到我通过以下方式保存:session.SaveOrUpdateCopy(entity);..不更新ID。而是:session.SaveOrUpdate(entity);..临时实体的Id将被更新。我可能误解了文档(?)..第9.4.2节说:SaveOrUpdateCopy(Objecto)...如果给定实例未保存或不存在于数据库中,NHibernate将保存它并将其作为新实例返回持久实例。只是我,还是听起来不像一个瞬态对象(未保存),将“作为持久性”返回?这是否意味着更新的ID?希望阐明如何正确解读这句话(?)以上是C#学习教程:NHibernate:HowdoestheidentityIDupdatewhensavingatransientinstance?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: