流畅的NHibernate忽略AutoMapping Overrides

时间:2014-04-23 11:19:19

标签: c# fluent-nhibernate

这个让我撕裂了我的头发。我正在使用Fluent NHibernate中的自动化功能,但它似乎有选择地忽略了一些覆盖,但实现其他优先。

不工作:

  public class CupTree
  {
    public virtual int Id { get; set; }
    public virtual int TournamentId { get; set; }
    public virtual int CurrentRound { get; set; }
    public virtual IList<CupRound> Rounds { get; set; }
  }

不工作覆盖:

  public class CupTreeOverride : IAutoMappingOverride<CupTree>
  {
    public void Override(FluentNHibernate.Automapping.AutoMapping<CupTree> mapping)
    {
      mapping.HasMany(x => x.Rounds).Cascade.All();
    }
  }

架构生成:

  public void GenerateSchema()
    {
      var config = new MappingConfiguration();

      Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(/*my conn str*/))
         .Mappings(m => m.AutoMappings.Add(
           AutoMap.AssemblyOf<CupTree>(config)
           .Conventions.Add(
              DefaultLazy.Never(),
              Table.Is(x => x.EntityType.Name + "s"))
           .UseOverridesFromAssembly(Assembly.GetAssembly(typeof(CupTreeOverride)))
           ))
         .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
         .BuildSessionFactory();
    } 

所以,虽然它创建了CupTree表,但它根本不会创建CupRounds表。但它确实创建了PreMatchTeamInfo表及其所有子表。我显然做了一些非常愚蠢的事情,但似乎无法发现它。任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

我已设法将其跟踪到列名称。我更改了SchemaUpdate,使其打印出sql语句并运行它们。

这会生成SQL错误,这些错误不会导致我的架构更新失败(表示一切正常)。我使用了名称&#34; Order&#34;作为我的类的属性名称,这当然是SQL中的保留字。我将名称更改为其他名称,一切正常。

对于下一个人,解决此问题的方法是:

  1. 使FNH生成hbm.xml文件。您可以通过在AutoMap配置上调用ExportTo来执行此操作:

    .Mappings(m => m.AutoMappings.Add(
           AutoMap.AssemblyOf<CupTree>(config)
           .Conventions.Add(
              DefaultLazy.Never(),
              Table.Is(x => x.EntityType.Name + "s"))
           .UseOverridesFromAssembly(Assembly.GetAssembly(typeof(CupTreeOverride)))
           ).ExportTo(@"C:\nh.out"))
    
  2. 检查输出的文件并确保一切正确。如果没有,则表明存在映射问题。

  3. 如果您的xml文件正常,请检查它运行的SQL语句。您可以通过将SchemaUpdate.Execute上的第一个参数(脚本)设置为true来执行此操作。

    .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
    
  4. 复制并粘贴生成的SQL并对数据库运行它。如果有任何问题,您将收到错误并可以从中获取。