0

我使用 NHibernates 模式导出功能来创建和更新数据库。

然而有时(似乎更频繁地发生在慢速机器上)NHibernate 会生成不正确的更改表脚本。我禁用了模式导出并记录语句以调试问题。

此问题随机发生并影响随机不同的表。

一个示例脚本是:alter table dbo.VlogNet_NumberGroups add DKS_P03_Artikelgruppe BIGINT

然而,“DKS_P03_Artikelgruppe”列属于一个完全不同的映射,更糟糕的是,这个映射甚至被配置为NHibernate.Mapping.ByCode.SchemaAction.None.

编辑:澄清我的问题: 为什么 NHibernate 会随机混合不同的映射并发出破坏我的数据库的更改表命令。

映射:

公共类 NumberGroupMap : HierachicalEntityMap<NumberGroup>
{
    公共 NumberGroupMap()
    {
        属性(x => x.StartNumber);
        属性(x => x.EndNumber);
        属性(x => x.LastGeneratedNumber);
        属性(x => x.StartTime);
        属性(x => x.LifeSpan);
        属性(x => x.ResetOnNewYear);
        属性(x => x.IsResetable);
        属性(x => x.WarningAtPos);
    }

    公共覆盖字符串表名
    {
        得到{返回“VlogNet_NumberGroups”;}
    }
}

HierachicalEntityMap<T>派生自ClassMapping<T>,它只是添加了一些属性(ID、名称、父级)并将 TableName 设置为相应属性的值。

该字段DKS_P03_Artikelgruppe源自此映射:

公共类 DksCarrierInformationMap : ClassMapping<DksCarrierInformation>
{
    公共常量字符串 EntityTable = "DKS_Liste";

    公共 DksCarrierInformationMap()
    {
        表(实体表);
        SchemaAction(NHibernate.Mapping.ByCode.SchemaAction.None);

        Id(x => x.Auto_ID, x => x.Generator(Generators.Identity));
        属性(x => x.Versanddaten_ID, x => { x.NotNullable(true); x.Unique(true); });

        #region 发票地址
        // ... 为简洁起见
        #endregion

        #region 标签信息

        // ... 为简洁起见

        #endregion

        #region EDI

        // ... 为简洁起见

        组件(x => x.DKS_P01,x =>
                                      {
                                          x.Property(c => c.Artikelgruppe, c => c.Column("DKS_P01_Artikelgruppe"));
                                          x.Property(c => c.Anz_Teile, c => c.Column("DKS_P01_Anz_Teile"));
                                          x.Property(c => c.Anz_Buegel, c => c.Column("DKS_P01_Anz_Buegel"));
                                          x.Property(c => c.Gewicht, c => c.Column("DKS_P01_Gewicht"));
                                          x.Property(c => c.Type, c => { c.Column("DKS_P01_ArtikelTyp"); c.Type>(); c.Length(10); });
                                          x.Property(c => c.Bezeichnung, c => c.Column("DKS_P01_Bezeichnung"));
                                      });

        // ... 为简洁起见

        组件(x => x.DKS_P03,x =>
                                      {
                                          x.Property(c => c.Artikelgruppe, c => c.Column("DKS_P03_Artikelgruppe"));
                                          x.Property(c => c.Anz_Teile, c => c.Column("DKS_P03_Anz_Teile"));
                                          x.Property(c => c.Anz_Buegel, c => c.Column("DKS_P03_Anz_Buegel"));
                                          x.Property(c => c.Gewicht, c => c.Column("DKS_P03_Gewicht"));
                                          x.Property(c => c.Type, c => { c.Column("DKS_P03_ArtikelTyp"); c.Type>(); c.Length(10); });
                                          x.Property(c => c.Bezeichnung, c => c.Column("DKS_P03_Bezeichnung"));
                                      });

        // ... 为简洁起见

        组件(x => x.DKS_P20,x =>
                                      {
                                          x.Property(c => c.Artikelgruppe, c => c.Column("DKS_P20_Artikelgruppe"));
                                          x.Property(c => c.Anz_Teile, c => c.Column("DKS_P20_Anz_Teile"));
                                          x.Property(c => c.Anz_Buegel, c => c.Column("DKS_P20_Anz_Buegel"));
                                          x.Property(c => c.Gewicht, c => c.Column("DKS_P20_Gewicht"));
                                          x.Property(c => c.Type, c => { c.Column("DKS_P20_ArtikelTyp"); c.Type>(); c.Length(10); });
                                          x.Property(c => c.Bezeichnung, c => c.Column("DKS_P20_Bezeichnung"));
                                      });

        #endregion
    }
}

设置 NHibernate SessionFactory 的代码:

var modelMapper = new ModelMapper();
foreach(_assembliesToScan 中的 var 程序集)
{
    Logger.DebugFormat(" * {0}", 程序集);
    modelMapper.AddMappings(assembly.GetTypes());
}

Logger.InfoFormat("添加 {0} 类映射", _classMaps.Count);
foreach(_classMaps 中的 var 类型)
{
    Logger.DebugFormat(" * {0}", type);
    modelMapper.AddMapping(type);
}

var cfg = 新配置();

配置NHibernate(cfg,设置[类型]);
配置环境(cfg);
cfg.AddMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities());

验证架构(cfg);

SessionFactory = cfg.BuildSessionFactory();

4

1 回答 1

1

听起来可能与此有关?

NHibernate - 查询列错误

从那以后,NHibernate 源代码(v 3.3.4)得到了更新,应该已经解决了这个问题。

有关更多详细信息,请参阅:https ://groups.google.com/forum/#!topic/nhusers/BZoBoyWQEvs

于 2014-08-18T09:47:06.190 回答