1

我使用 Nuget 升级到 Nhibernate 3.2.0.4000 和 fluent 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();
        }
    }

}

对于移动特定选项,我有一堂课

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

此代码曾经可以工作,但自从升级后它不再工作了。我跟踪它并且对象正在内存中被更改,但是在下一个请求中,对象被“还原”。我已经逐步检查了代码以查看在下一个请求中我是否以某种方式导致该位翻转,但事实并非如此。数据库永远不会变硬。就好像最新的 fluent 不再知道如何在保存时映射 boolean -> bit。

4

1 回答 1

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)...;
于 2012-05-03T08:21:17.283 回答