1

我升级到Nhibernate 3.2.0.4000和流利的1.3.0.717使用Nuget。当我尝试保存时,曾经工作的映射现在引起了我的问题。数据加载正常,但是当我尝试更改任何布尔值时,它们将被忽略。我可以保存文本字段没有任何问题。实际上,我可以在一次保存中更改文本字段和布尔值,并且它实际上只是将文本字段更改保存到数据库中。流利Nhibernate不会保存hasmany布尔值

首先,我有一个选项对象

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

此代码用来工作,但由于升级不工作了。我追踪了它,并且内存中的对象正在更改,但随后在下一个请求中,对象被“还原”。我已经浏览了代码,看看下一个请求是否会导致位反转,而事实并非如此。数据库永远不会被磨损。就好像最新的流畅程序不再知道如何在保存时映射布尔值 - >位。

回答

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)...; 
+0

在旧版流利/ NHibernate的时,'.Generated.Insert();'工作和字段将更新。我最终删除了这部分映射,它像冠军一样工作。 – Josh 2012-05-03 19:10:58

相关问题