【问题标题】:Fluent NHibernate: override derived classes not in the base class auto-mappingFluent NHibernate:覆盖不在基类自动映射中的派生类
【发布时间】:2009-08-27 21:00:06
【问题描述】:

故事: 我有类用户和类组织:用户。我没有对这些类使用任何映射,让 FNH 自动进行映射。然后,我添加了

   public class OrganizationMap : IAutoMappingOverride<Organization>
   {
      public void Override(AutoMap<Organization> mapping)
      {
      }
   }

请注意,没有覆盖。所以我没想到 FNH 的行为会发生任何变化。但我得到了这个(实际上是在模式导出期间):

NHibernate.MappingException: (XmlDocument)(2,4):XML 验证 错误:元素“类”在 命名空间'urn:nhibernate-mapping-2.2' 内容不完整。清单 预期的可能元素:'元, 子选择,缓存,同步, 评论、tuplizer、id、composite-id' 在命名空间中 'urn:nhibernate-mapping-2.2'.

生成的 Orders.Core.Organization.hbm.xml 确实是空的:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
  <class name="Orders.Core.Organization, Orders.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Organizations" xmlns="urn:nhibernate-mapping-2.2" />
</hibernate-mapping>

所以,在我查看了 User.hbm 之后,我明白了 - 我需要像这样覆盖基类中的组织:

   public class UserMap : IAutoMappingOverride<User>
   {
      public void Override(AutoMap<User> mapping)
      {
         mapping.JoinedSubClass<Organization>("ColumnId", m => {...}
         );
      }
   }

但是,我最好在组织的单独映射覆盖类中执行此操作...毕竟,如果我在单个 Override 方法中有 5 个子类,映射会变成什么。

这可能吗?

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

    您的覆盖告诉 FNH 您将为该类手动编写映射。您收到的错误是因为没有为组织映射任何内容(如果您查看生成的 HBM.xml,它将为空)。

    你到底想写什么覆盖?

    编辑:

    在这种情况下,您可以这样做:

    public class MyAlteration : IAutoMappingAlteration
    {
        public void Alter(AutoPersistenceModel model)
        {
            model.ForTypesThatDeriveFrom<User>(
                map => map.HasMany<User>( x => x.Children)
            );
        }       
    }
    

    以及在配置流畅的nhibernate时:

    model.Alteration( a => a.Add<MyAlteration>());
    

    注意:这是使用 fluent nhibernate (1.0RC) 的最新代码库。

    【讨论】:

    • 我想要的是覆盖他们自己的映射类中的子类,即在 OrganizationMap 内部,比如“IsSubclassOf()”。
    【解决方案2】:

    事实证明,最新的 FNH(RC 之后的一些修订)现在可以实现。我想知道这是不是因为我问了;-)

    所以我有这个

     mapping.JoinedSubClass<Organization>("UserId", m =>
        {
           m.HasMany(x => x.Currencies).Element("Currency").AsBag();
        }
     );
    

    升级到 RC 后它停止工作。然后我把它移到了它自己的类中

       public class OrganizationMap : IAutoMappingOverride<Organization>
       {
          public void Override(AutoMapping<Organization> mapping)
          {
             mapping.HasMany(x => x.Currencies).Element("Currency").AsBag();
          }
       }
    

    它又开始工作了。就像我想要的一样!现在我什至不需要指出 JoinedSubClass 因为这是默认值,无论如何。我可以重写我的子类属性,这很酷。

    虽然很难弄清楚为什么 NH 开始抱怨字符串关联......我什至认为 .Element 在 RC 中被破坏了。我想知道如果 JoinedSubClass 不能完全工作,为什么还有这个映射部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2011-08-08
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      相关资源
      最近更新 更多