Fluent nhibernate Fluent NHibernate-每个子类的混合表和每个类层次结构的表
给出以下结构:Fluent nhibernate Fluent NHibernate-每个子类的混合表和每个类层次结构的表,fluent-nhibernate,joined-subclass,table-per-hierarchy,Fluent Nhibernate,Joined Subclass,Table Per Hierarchy,给出以下结构: MyBaseClass { public int Id {get; private set;} } MySubclassWithDiscriminator : MyBaseClass { } MySubclass : MyBaseClass { public string SomeThing {get; set;} } 我如何使用Fluent NH正确地映射这些,使用每个子类的表和每个类的表层次结构的组合?我尝试了一个自定义的AutomappingConfigura
MyBaseClass {
public int Id {get; private set;}
}
MySubclassWithDiscriminator : MyBaseClass {
}
MySubclass : MyBaseClass {
public string SomeThing {get; set;}
}
我如何使用Fluent NH正确地映射这些,使用每个子类的表和每个类的表层次结构的组合?我尝试了一个自定义的AutomappingConfiguration,但似乎在兜圈子:
public class AutomappingConfiguration : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return type.Namespace.Contains("Entities");
}
public override bool IsDiscriminated(Type type)
{
// only classes with additional properties should be
// using the table-per-subclass strategy
if ((type.IsAssignableFrom(typeof(MyBaseClass)) ||
type.IsSubclassOf(typeof(MyBaseClass)) &&
type.GetProperties(BindingFlags.Public |
BindingFlags.FlattenHierarchy)
.Count() <= 1))
{
return true;
}
return false;
}
}
public class SubclassConvention : ISubclassConvention
{
public void Apply(ISubclassInstance instance)
{
// Use the short name of the type, not the full name
instance.DiscriminatorValue(instance.EntityType.Name);
}
}
根据我的调查,使用FNH时,使用鉴别器似乎是一种二进制选择,而HBM能够同时拥有鉴别器列和子类。编辑-2011-05-12
我重写这篇文章是为了回应詹姆斯·格雷戈里的评论
以下是我试图实现的HBM:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class
xmlns="urn:nhibernate-mapping-2.2"
name="Mixed_Parent"
abstract="true"
table="`Mixed_Parent`">
<id name="Id" type="System.Int32">
<generator class="identity" />
</id>
<discriminator type="String">
<column name="discriminator" />
</discriminator>
<subclass
name="Mixed_TPCH_Child"
discriminator-value="Mixed_TPCH_Child" />
<subclass
name="Mixed_TPS_Child"
discriminator-value="Mixed_TPS_Child">
<join table="`Mixed_TPS_Child`" >
<key column="Id" />
<property name="Description" type="String">
<column name="Description" />
</property>
</join>
</subclass>
</class>
</hibernate-mapping>
所以,我所看到的是,生成的HBM要么是a,要么没有子元素,而不是两者的组合。我是不是遗漏了什么
下面是一个失败的测试,可以添加到子类PersistenceModelTests中以说明:
namespace MixedTablePerSubclassWithTablePerClassHierarchy
{
public class Mixed_Parent
{
public virtual int Id { get; set; }
}
public class Mixed_TPCH_Child
{
}
public class Mixed_TPS_Child
{
public virtual string Description { get; set; }
}
public class Mixed_ParentMap : ClassMap<Mixed_Parent>
{
public Mixed_ParentMap()
{
Id(x => x.Id);
DiscriminateSubClassesOnColumn("discriminator");
}
}
public class Mixed_TPCH_ChildMap : SubclassMap<Mixed_TPCH_Child>
{ }
public class Mixed_TPS_ChildMap : SubclassMap<Mixed_TPS_Child>
{
public Mixed_TPS_ChildMap()
{
Map(x => x.Description);
}
}
}
[Test]
public void ShouldAllowMixedTablePerSubclassWithTablePerClassHierarchy()
{
var model = new PersistenceModel();
model.Add(
new MixedTablePerSubclassWithTablePerClassHierarchy
.Mixed_ParentMap());
model.Add(
new MixedTablePerSubclassWithTablePerClassHierarchy
.Mixed_TPCH_ChildMap()
);
model.Add(
new MixedTablePerSubclassWithTablePerClassHierarchy
.Mixed_TPS_ChildMap());
var classMapping = model.BuildMappings()
.First()
.Classes.First();
// WHAT SHOULD THIS NUMBER BE (0, 1 or 2)?
classMapping.Subclasses.Count().ShouldEqual(1);
classMapping
.Subclasses
.First()
.Type
.ShouldEqual(
typeof(
MixedTablePerSubclassWithTablePerClassHierarchy
.Mixed_TPS_Child)
); // WHICH OF THE CHILDREN WOULD BE FIRST?
}
我想你误解了测试的目的;它确保元素内部不会出现额外的元素。你的哈佛商学院也不这么做,所以我不明白问题出在哪里。测试中的映射应该与HBM的工作方式相同。好的,我可以看出我是如何误解了我调用的测试的。因此,我用一个失败的测试和模型更新了我的编辑,该测试和模型可以添加到SubclassPersistenceModelTests.cs文件中,以帮助说明我的困惑。顺便问一下,关于重写问题的策略是什么?我想我可以把我原来的问题和这个尝试的答案结合起来,让事情变得更清楚。