什么会导致更改不为现有实体生成更新语句?我有一个更新实体状态枚举的命令。它将其从“活动”更改为“已删除”。我使用相同的命令(通常)更新其他实体上的状态位而没有问题。我可以更新有问题的实体上的单个字符串,而无需更改任何其他内容,并且更新过程正常。我可以在NHProf中观察到这一切......
我想我的问题是:
感谢您的帮助!
一个线索。基类型的属性是:
public virtual EntityStatus Status { get; protected set; }
如果我让setter公开并直接分配给它,NHibernate就可以了。当它受到保护时,我在实体上调用一个方法并在那里更新状态。这提供了任何线索吗?
答案 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日志记录并查看它的内容,你可能会在日志中找到一些有用的信息。
老实说,我也会在您的问题中发布违规代码。通过查看代码,可以更容易地判断出问题可能出在哪里。