我使用Nuget升级到Nhibernate 3.2.0.4000并使用流畅的1.3.0.717。过去工作的映射现在导致我在尝试保存时出现问题。数据加载正常,但是当我尝试更改任何布尔值时,它们将被忽略。我可以毫无问题地保存文本字段。实际上,我可以在一次保存中更改文本字段和布尔值,它实际上只将文本字段更改保存到数据库中。
首先,我有一个选项对象
public class Options
{
public virtual long OptionsId { get; set; }
private IList<MobileOptions> MobileGatewayList { get; set; }
public virtual MobileOptions MobileGateway
{
get
{
if (MobileGatewayList == null)
return null;
return MobileGatewayList.FirstOrDefault();
}
}
}
对于Mobile特定选项,我有一个类
public class MobileOptions
{
public virtual long MobileOptionsId { get; set; }
public virtual Options Options { get; set; }
public virtual SharedGatewayOptions SharedGatewayOptions { get; set; }
}
SharedGatewayOptions
是我所有选项子集的一类共享选项(我有3个,但我只显示移动设备以保持此示例简洁)。具体来说,我注意到错误在布尔标志中,以启用我的应用程序的移动部分。
public class SharedGatewayOptions
{
public virtual bool GatewayActivated { get; set; }
}
我的主要选项类地图选项中的移动选项的映射如下所示
HasMany<MobileOptions>(Reveal.Member<GatewayOptions>("MobileGatewayList"))
.KeyColumn("OptionsId")
.Cascade.All();
我必须使用hasmany,因为包含移动选项的表包含父ID,但父级不包含子表的列。数据库中没有FK关系,我无法使HasOne工作。
以下是MobileOptions类映射
中的映射References<GatewayOptions>(x => x.Options, "OptionsId");
Component(x => x.SharedGatewayOptions, y =>
{
y.Map(x => x.GatewayActivated, "ActivateGateway").Generated.Insert();
});
当我创建新选项记录和移动选项时,这一切都正常,并且使用默认设置进行设置。但是当我去更改激活布尔值(或任何其他布尔值)时,没有错误,也没有任何内容保存回数据库。但是,在保存文本字段和布尔字段时,在另一个子选项(与MobileOptions
非常相似)上,只有文本字段会更改。
我更改位的代码如下所示
public void ToggleGateways(ToggleGatewaysRequest request)
{
var options = GetOptions(new GatewayOptionsRequest() { SiteId = request.SiteId });
options.RemoteGateway.SharedGatewayOptions.GatewayActivated = request.RemoteGatewayActivated;
optionsRepository.Save(options);
}
此代码曾用于工作,但自升级以来它不再起作用。我追踪它并且对象在内存中被更改,但是在下一个请求中,对象被“恢复”。我已经逐步完成代码,看看在下一个请求中我是否以某种方式导致该位翻转,而事实并非如此。数据库永远不会被强化。就像最新的流利不再知道如何映射布尔 - &gt;保存。
答案 0 :(得分:1)
AFAIK .Generated.Insert();
表示此属性在插入时生成,然后从未更改,但由于您要更改它,因此应将其保留。
不是您问题的直接答案,但是您是否考虑过加入另一张表来获得所需的值?
public class Options
{
public virtual long OptionsId { get; set; }
public virtual MobileOptions MobileGateway { get; set; }
}
// in OptionsMap
Join("MobileOptions", join =>
{
join.Optional();
join.KeyColumn("OptionsId");
join.Component(x => x.SharedGatewayOptions, y =>
{
y.Map(x => x.GatewayActivated, "ActivateGateway");
});
});
或另类课程设计
public class GatewayOptions
{
public virtual bool GatewayActivated { get; set; }
}
public class MobileOptions : GatewayOptions
{
public virtual bool Something { get; set; }
}
// in OptionsMap
RefernecesAny(x => x.Options)...;