功能NHibernate:重写派生类未在基类自动映射(Fluent NHibernate: over

2019-09-22 03:52发布

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

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

注意,这里是没有覆盖。 所以,我没想到在FNH行为的任何变化。 但是我得到这个(过程模式实际出口):

NHibernate.MappingException:(XmlDocument的)(2,4):XML验证错误:元素命名空间 '类' '瓮:NHibernate的映射-2.2' 具有不完整的内容。 可能元素的列表预计:“元,子查询,高速,同步,评论,的tuplizer,ID,复合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 - 我需要重写组织在基类中是这样的:

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

但是,我会更好地喜欢做这在组织一个单独的映射覆盖类...毕竟,什么将成为映射,如果我有5子类都在一个覆盖方法。

这可能吗?

Answer 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)的最新代码库。



Answer 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仍然有这个映射的一部分,如果它完全不起作用。



文章来源: Fluent NHibernate: override derived classes not in the base class auto-mapping