我有一个名为category的类
public category(){ Items = new List<Item>(); Prices = new List<Price>();}
这两种方法几乎完全相同.构造函数分别设置一个名为category的属性及其@R_301_6889@和Price.
public virtual Item AddItem(string @R_301_6889@){ var item = new Item(this,@R_301_6889@); Items.Add(item); return item;}public virtual Price AddPrice(decimal price){ var price = new Price(this,price); Prices.Add(price); return price;}
映射
public class categoryMap : ClassMap<category>{ public categoryMap() { // Other propertIEs HasMany(x=>x.Items).Cascade.AllDeleteOrphan(); HasMany(x=>x.Prices).Cascade.AllDeleteOrphan(); }}
如您所见,两个集合的映射方式完全相同.
Price和Item的映射都具有相同的映射
References(x=>x.category);
据我所知,几乎关于这两者的一切都是相同的.这是问题所在
category.AddItem(some@R_301_6889@);session.Save(category); // Workscategory.AddPrice(somePrice);session.Save(category); // Doesn't work
它们位于我用来填充测试数据库的文件中.保存项目工作正常.保存价格没有.类和映射是相同的.我无法弄清楚.
映射应该可以正常工作,因为调用构造函数直接工作正常
session.Save(new Price(category,1));
那么为什么category保存一个集合而不另一个?我运行了探查器,该类甚至没有尝试保存Price集合.
更新:
正如Gabe在评论中指出的那样,如果我交换调用以便在Item之前调用Price,则Price进入数据库而Item不进入.
如果我在每次收集更新后调用session.Flush(),它都可以正常工作.我应该这样做,还是有办法修复我的映射,以便它的工作原理?
解决方法 尝试交换调用的顺序(首先添加价格,然后添加项目)以查看价格映射是否确实存在问题,或者问题是第二次调用失败.关于flush – 大多数情况下你不需要显式调用flush,这是nHibernate在需要时(details here)在后台执行的 *** 作.刷新模式不是映射问题(它是您可以设置的会话属性,但通常您不必这样做).
如果要在事务中包装代码,则不需要刷新.如果你不是,你应该是,这可能是你的问题.
using (var tx = Session.BeginTransaction()) { category.AddItem(some@R_301_6889@); category.AddPrice(somePrice); session.Save(category); tx.Commit();}
更新:我想我知道你的问题是什么.鉴于您的代码,看起来您正在创建一个新的类别对象并用数据填充它.在第一个Save()上,nHibernate执行自动刷新,因为它不能将category_ID分配给子集合,直到它从db获取一个.但第二次,类别有一个ID,所以会话不需要立即刷新.当不需要时,nHibernate对数据库不熟悉.正如我上面提到的,解决方案是始终使用事务来指定何时完成您的工作.
总结以上是内存溢出为你收集整理的c# – 为什么我的类将一个集合保存到数据库而不保存另一个集合?全部内容,希望文章能够帮你解决c# – 为什么我的类将一个集合保存到数据库而不保存另一个集合?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)