故事: 我有类用户和类组织:用户。我没有为这些类使用任何映射,让 FNH 自动进行映射。然后,我添加了
public class OrganizationMap : IAutoMappingOverride<Organization>
{
public void Override(AutoMap<Organization> mapping)
{
}
}
请注意,没有覆盖。所以我没想到 FNH 行为会发生任何变化。但我得到了这个(实际上在模式导出期间):
NHibernate.MappingException: (XmlDocument)(2,4): XML validation error: The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has incomplete content. List of possible elements expected: 'meta, subselect, cache, synchronize, comment, tuplizer, id, composite-id' in namespace '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 => {...}
);
}
}
但是,我更愿意在 Organization 的单独映射覆盖类中执行此操作...毕竟,如果我在单个覆盖方法中有 5 个子类,映射会变成什么。
这可能吗?
最佳答案
您的覆盖告诉 FNH 您将手动为该类编写映射。您收到的错误是因为没有为组织映射任何内容(如果您查看生成的 HBM.xml,它将是空的)。
您究竟要为什么编写覆盖?
编辑:
在这种情况下,您可以这样做:
public class MyAlteration : IAutoMappingAlteration
{
public void Alter(AutoPersistenceModel model)
{
model.ForTypesThatDeriveFrom<User>(
map => map.HasMany<User>( x => x.Children)
);
}
}
并且在配置 fluent nhibernate 时:
model.Alteration( a => a.Add<MyAlteration>());
注意:这是使用最新的 fluent nhibernate (1.0RC) 代码库。
关于fluent-nhibernate - 流利的 NHibernate : override derived classes not in the base class auto-mapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1226723/