NHibernate实体未更新

时间:2012-10-12 18:08:22

标签: nhibernate any

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

我想我的问题是:

  • 什么会导致NHibernate在更改枚举值(没有其他内容......或其他内容?)时更新实体?
  • 追踪这类问题的最佳方法是什么?

感谢您的帮助!

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

public virtual EntityStatus Status { get; protected set; }

如果我让setter公开并直接分配给它,NHibernate就可以了。当它受到保护时,我在实体上调用一个方法并在那里更新状态。这提供了任何线索吗?

2 个答案:

答案 0 :(得分:2)

所以,这是一个有趣的,并且在追踪屁股的过程中总是很痛苦。事实证明,在Any映射中使用Lazy加载会以某种方式将ol'pooch搞砸。因此,当我这样做时,调用虚拟方法来更新受保护的属性是不起作用的:

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);
                        });

无论如何,我真的希望这可以帮助其他人疯狂到使用Any映射。

答案 1 :(得分:0)

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

同时确保您实际上将值更改为与以前不同的值。如果您为此实体启用了dynamic-update并且实际上没有更改该值,则不会生成更新。

  

dynamic-update(可选,默认为false):指定UPDATE   SQL应该在运行时生成,并且只包含那些列   其价值已发生变化。

我也会启用NHibernate日志记录并查看它的内容,你可能会在日志中找到一些有用的信息。

老实说,我也会在您的问题中发布违规代码。通过查看代码,可以更容易地判断出问题可能出在哪里。