故事: 我有班级用户和班级组织:用户。我没有对这些类使用任何映射,让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个子类,那么映射会变成什么。
这可能吗?
答案 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仍然有这个映射部分,如果它没有完全工作。