假设我有一些像这样的定义:
public interface ICategory
{
int ID { get; set; }
string Name { get; set; }
ICategory Parent { get; set; }
}
public class Category : ICategory
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual ICategory Parent { get; set; }
}
如何在NHibernate / EF 4中映射这样的场景?我正在尝试分离DAL的实现。
我正在学习NHibernate,EF 4。
此致 卡兰
答案 0 :(得分:0)
NHibernate在将接口映射到表时遇到了问题。
我们通过创建一个用于映射的具体类型的受保护变量,并将接口类型公开为该具体类型的getter / setter来解决它:
// this is mapped to the table
protected virtual Category ConcreteParent { get; set; }
// this is used to access the mapped one
public virtual ICategory Parent
{
get
{
return (ICategory)ConcreteParent;
}
set
{
ConcreteParent = (Category)value;
}
}
(那段代码不在我的脑海中 - 我相信它会隐藏一个语法错误,但这个想法就在那里)。
它不是最漂亮的实现,感觉很丑,但它确实有效。也许其他人会看到这个,并有另一种选择:)。
答案 1 :(得分:0)
我不知道使用NHibernate进行层次结构映射的问题。但是,也许你已经知道如果你报告这个问题,这里应该怎么做:
<class name="ICategory" table="Categories">
<id name="ID" column="IdCategory">
<generator class="identity">
</id>
<property name="Name"/>
<component name="Parent" class="ICategory"> <!-- class attribute is normally optional -->
<!-- Here, I would have some test to do to determine whether we have to list the properties -->
<!-- I would say no and this would makes sense to me, but without having tested it, I can't confirm. -->
</component>
<union-subclass="Category">
...
</union-subclass>
</class>
如果你的Category对象类不再提供比你的接口ICategory更多的属性,你可以将所有属性放在父类元素中,然后只声明你后续的 union -subclass 对象。
您可以查询NHibernate Reference Documentation, Chapter 8 - Inheritence mapping以获取有关该主题的更多详细信息。至于组件映射,您要检查Chapter 7 - Component Mapping。
对于EF4,我无法帮助,因为我从未使用它。遗憾。