首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fluent NHibernate忽略AutoMapping重写

Fluent NHibernate忽略AutoMapping重写
EN

Stack Overflow用户
提问于 2014-04-23 11:19:18
回答 1查看 424关注 0票数 0

这一次让我把头发扯掉。我正在使用Fluent NHibernate中的自动化功能,但它似乎有选择地忽略了一些重写,但实现了其他一些很好。

不起作用:

代码语言:javascript
复制
  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; }
  }

不工作覆盖:

代码语言:javascript
复制
  public class CupTreeOverride : IAutoMappingOverride<CupTree>
  {
    public void Override(FluentNHibernate.Automapping.AutoMapping<CupTree> mapping)
    {
      mapping.HasMany(x => x.Rounds).Cascade.All();
    }
  }

模式生成:

代码语言:javascript
复制
  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表及其所有子表。很明显,我在做一些不可思议的蠢事,但似乎找不到它。这里的任何帮助都非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-23 11:40:27

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

这会生成SQL错误,这不会导致我的模式更新失败(说一切正常)。我在类中使用了名称"Order“作为属性名,这在SQL中当然是一个保留字。我换了别的名字,一切都很好。

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

  1. 让FNH生成hbm.xml文件。为此,您可以在您的ExportTo配置上调用AutoMap: .UseOverridesFromAssembly(Assembly.GetAssembly(typeof(CupTreeOverride))) ) .Mappings(m => m.AutoMappings.Add( AutoMap.AssemblyOf(config) .Conventions.Add( DefaultLazy.Never(),Table.Is(x => x.EntityType.Name + "s"))
  2. 检查输出的文件并确保所有内容都正确。如果没有,则有映射问题。
  3. 如果xml文件很好,请检查它运行的SQL语句。为此,您可以将SchemaUpdate.Execute上的第一个参数(脚本)设置为true。 .ExposeConfiguration(cfg => =>SchemaUpdate(Cfg).Execute(真,真))
  4. 复制并粘贴生成的SQL并在数据库中运行它。如果有任何问题,你会得到错误,并从那里可以采取它。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23242717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档