在nHibernate中如何映射一个继承一个抽象class同时实现一个接口的类?
How to map a calss that inherits an asbtract class and implements an interface at the same time in nHibernate?
假设我们有这个实体:
public interface ISomeone
{
}
public abstract class Parent
{
}
public class Child : Parent , ISomeone
{
}
public class Orphan : ISomeone
{
}
public class MyHeart
{
public ISomeone Person {get;set;}
}
那么如何在 nhibernate 中映射所有 classes?
我更喜欢为 "Parent"、"Orphane" 和 "MyHeart" class 使用单独的表格。
"Parent" 、 "Orphan" 和 "MyHeart" 应该作为聚合根持久存在,并且 MyHeart 可以与实现 "ISomeone" 接口的任何实体有关系。因此它可以扩展到具有不同 id 的不同实体类型,形成不同的表
我终于找到了解决办法
"Any" 方法就是答案,通过这种方法,我们为另一个世界中 IPerson 的每个可能值定义了一些元值,每个实现此接口的 class 都应该在 "Any" 方法中定义然后nHibernate 保留 Id 和 MetaValue。
我的示例的代码映射如下:
public class MyHeartMapping : ClassMapping<MyHeart>
{
public MyHeartMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
Any(p => p.Person, typeof(long), m => {
m.MetaValue("Child", typeof(Child));
m.MetaValue("Orphane", typeof(Orphane));
m.Columns(i => i.Name("PersonId"), c => c.Name("ClassName")); });
}
}
public class ParentMapping : ClassMapping<Parent>
{
public ParentMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
Discriminator(c => c.Column("Discriminator"));
}
}
public class ChildMapping : SubclassMapping<Child>
{
public ChildMapping()
{
DiscriminatorValue("Child");
}
}
public class OrphaneMapping : ClassMapping<Orphane>
{
public OrphaneMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
}
}
假设我们有这个实体:
public interface ISomeone
{
}
public abstract class Parent
{
}
public class Child : Parent , ISomeone
{
}
public class Orphan : ISomeone
{
}
public class MyHeart
{
public ISomeone Person {get;set;}
}
那么如何在 nhibernate 中映射所有 classes? 我更喜欢为 "Parent"、"Orphane" 和 "MyHeart" class 使用单独的表格。 "Parent" 、 "Orphan" 和 "MyHeart" 应该作为聚合根持久存在,并且 MyHeart 可以与实现 "ISomeone" 接口的任何实体有关系。因此它可以扩展到具有不同 id 的不同实体类型,形成不同的表
我终于找到了解决办法 "Any" 方法就是答案,通过这种方法,我们为另一个世界中 IPerson 的每个可能值定义了一些元值,每个实现此接口的 class 都应该在 "Any" 方法中定义然后nHibernate 保留 Id 和 MetaValue。
我的示例的代码映射如下:
public class MyHeartMapping : ClassMapping<MyHeart>
{
public MyHeartMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
Any(p => p.Person, typeof(long), m => {
m.MetaValue("Child", typeof(Child));
m.MetaValue("Orphane", typeof(Orphane));
m.Columns(i => i.Name("PersonId"), c => c.Name("ClassName")); });
}
}
public class ParentMapping : ClassMapping<Parent>
{
public ParentMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
Discriminator(c => c.Column("Discriminator"));
}
}
public class ChildMapping : SubclassMapping<Child>
{
public ChildMapping()
{
DiscriminatorValue("Child");
}
}
public class OrphaneMapping : ClassMapping<Orphane>
{
public OrphaneMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
}
}