3

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

我想我的问题是:

  • 什么会导致 NHibernate 在枚举值(而不是其他......或其他东西?)被更改时不更新实体?
  • 追踪此类问题的最佳方法是什么?

谢谢你的帮助!

线索。基本类型的属性是:

public virtual EntityStatus Status { get; protected set; }

如果我将 setter 公开并直接分配给它,NHibernate 就会很好地接受它。当它受到保护时,我在实体上调用一个方法并在那里更新状态。这是否提供任何线索?

4

2 回答 2

2

所以,这是一个有趣的事情,而且追查起来很痛苦。事实证明,在 Any 映射中使用延迟加载以某种方式在某处搞砸了老狗。因此,当我这样做时,调用虚拟方法来更新受保护的属性不起作用:

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 映射的人。

于 2012-10-16T21:29:54.003 回答
0

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

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

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

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

老实说,我还会在您的问题中发布有问题的代码。通过查看代码,总是更容易判断哪里可能出错。

于 2012-10-12T18:59:34.283 回答