Fluent NHibernate:覆盖不在基类自动映射中的派生类

时间:2009-08-04 10:21:03

标签: fluent-nhibernate

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

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

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

  

NHibernate.MappingException:   (XmlDocument)(2,4):XML验证   错误:元素'class'   namespace'瓮:nhibernate-mapping-2.2'   内容不完整。清单   可能的元素:'meta,   subselect,cache,synchronize,   评论,tuplizer,id,composite-id'   在命名空间   '瓮:NHibernate的映射-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之后我得到了这个想法 - 我需要像这样覆盖基类中的Organization:

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

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

这可能吗?

2 个答案:

答案 0 :(得分: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>());

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

答案 1 :(得分:1)

事实证明,使用最新的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仍然有这个映射部分,如果它没有完全工作。