未更新NHibernate实体

未更新NHibernate实体,nhibernate,any,Nhibernate,Any,什么会导致更改不为现有实体生成update语句?我有一个命令更新实体上的状态枚举。它将其从活动更改为已删除。我使用相同的命令(一般)更新其他实体上的状态位,没有问题。我可以在不更改任何其他内容的情况下更新相关实体上的单个字符串,并且更新过程很好。我可以在NHProf中观察到这一切 我想我的问题是: 当一个枚举值(没有其他东西…或其他东西要更改?)被更改时,什么会导致NHibernate不更新一个实体 追踪此类问题的最佳方式是什么 谢谢你的帮助 线索。基类型上的属性为: public virt

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

我想我的问题是:

  • 当一个枚举值(没有其他东西…或其他东西要更改?)被更改时,什么会导致NHibernate不更新一个实体
  • 追踪此类问题的最佳方式是什么
谢谢你的帮助

线索。基类型上的属性为:

public virtual EntityStatus Status { get; protected set; }

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

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

还要确保您实际上正在将该值更改为与以前不同的值。如果为该实体启用了
动态更新
,并且实际上没有更改值,则不会生成更新

动态更新(可选,默认为false):指定该更新 SQL应该在运行时生成,并且只包含那些列 其值已更改

我还将启用NHibernate日志,并查看它所显示的内容,您可能会在日志中找到一些有用的信息


老实说,我也会在你的问题中发布冒犯性的代码。通过查看代码,可以更容易地判断出哪里出了问题。

因此,这是一个有趣的问题,也是一个让人头疼的问题。事实证明,在Any映射中使用惰性加载不知何故会在某个地方破坏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(o=>o.Thing,typeof(Guid),m=>
{
m、 IdType();
m、 元类型();
m、 元值(“蠕动”,类型(蠕动));
m、 元值(“有气味的”,类型(有气味的东西));
m、 列(id=>id.Name(“ThingId”),cr=>cr.Name(“ThingType”);
m、 懒惰(真);
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(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(o=>o.Thing,typeof(Guid),m=>
{
m、 IdType();
m、 元类型();
m、 元值(“蠕动”,类型(蠕动));
m、 元值(“有气味的”,类型(有气味的东西));
m、 列(id=>id.Name(“ThingId”),cr=>cr.Name(“ThingType”);
m、 懒惰(假);
m、 Cascade(Cascade.Persist);
});

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

有趣的是,在这种情况下,我不确定这会更容易。我已经讨论过一百次了,这些冗长的映射几乎与其他实体相同,它们使用完全相同的泛型命令来执行对存在于它们都从中继承的抽象类上的属性的更新。代码都通过完全相同的命令处理程序,使用完全相同的会话/事务管理和除一个实体类型外的所有实体类型工作。真奇怪!!另一个线索:基类型上的属性是public virtual EntityStatus Status{get;protected set;}如果我将setter设置为public并直接分配给它,NHibernate会很好地选择它。当它受到保护时,我调用实体上的一个方法并更新那里的状态。这提供了什么线索吗?