2012-10-12 60 views
3

什么会导致更改不生成更新语句的现有实体?我有一个更新实体状态枚举的命令。它将其从“活动”更改为“已删除”。我使用相同的命令(通常)来更新其他实体上的状态位,没有问题。我可以更新有关实体的单个字符串而不更改其他任何内容,并且更新过程正常。我可以看到这一切会倒在NHProf ...NHibernate实体未更新

我想我的问题,然后是:

  • 什么会导致NHibernate的不更新实体时枚举值(和其它...或其他的东西?)被改变了?
  • 追踪这些问题的最佳方式是什么?

感谢您的帮助!

一条线索。基类型的属性是:

public virtual EntityStatus Status { get; protected set; } 

如果我做的setter公开和直接分配给它,NHibernate的捡起来就好了。当它受到保护时,我会在实体上调用一个方法并更新其中的状态。这是否提供了任何线索?

回答

2

所以,这是一个有趣的和屁股追踪的全部痛苦。事实证明,使用任何映射内部的Lazy加载以某种方式将ol'加入到某处。因此,调用虚方法来更新受保护的财产,当我做这不起作用:

Any(o => o.Thing, typeof(Guid), m => 
         { 
          m.IdType<Guid>(); 
          m.MetaType<string>(); 
          m.MetaValue("Squirmy", typeof(SquirmyThing)); 
          m.MetaValue("Odoriferous", typeof(OdoriferousThing)); 
          m.Columns(id => id.Name("ThingId"), cr => cr.Name("ThingType")); 
          m.Lazy(true); 
          m.Cascade(Cascade.Persist); 
         }); 

但它确实工作时,我这样做:

Any(o => o.Thing, typeof(Guid), m => 
         { 
          m.IdType<Guid>(); 
          m.MetaType<string>(); 
          m.MetaValue("Squirmy", typeof(SquirmyThing)); 
          m.MetaValue("Odoriferous", typeof(OdoriferousThing)); 
          m.Columns(id => id.Name("ThingId"), cr => cr.Name("ThingType")); 
          m.Lazy(false); 
          m.Cascade(Cascade.Persist); 
         }); 

不管怎样,我真的希望这可以帮助别人足够疯狂使用任何映射。

0

如果您正在更新的实体不在会话对象中,则可能发生这种情况。确保您没有关闭您查询原始对象或将其附加到的会话。

此外,请确保您实际上将价值改变为与以前不同的价值。如果您已为此实体启用dynamic-update,并且实际上并未更改该值,则不会生成更新。

动态更新(可选,默认为false):指定用于UPDATE SQL将会在运行时产生并且只包含那些改变过的那些列 。

我会启用NHibernate的日志记录也看看它吐出什么,你可能会发现日志中的一些有用的信息。

老实说,我也会在你的问题中发布有问题的代码。通过查看代码可以很容易地知道事情可能出错的地方。

+0

有趣的是,在这种情况下,我不确定它会更容易。我已经完成了上百次,而且这些懒散的映射与其他使用完全相同的泛型命令来更新存在于它们都继承的抽象类上的属性的实体几乎完全相同。代码全部通过完全相同的命令处理程序,使用完全相同的会话/事务管理以及除一个实体类型外的所有工作。这是奇怪的! – Jereme

+0

另一个线索:基本类型的属性是公共虚拟EntityStatus Status {get;保护组; }如果我将setter公开并直接分配给它,NHibernate就可以很好地完成它。当它受到保护时,我会在实体上调用一个方法并更新其中的状态。这是否提供了任何线索? – Jereme

相关问题