多态关联和分裂表

时间:2011-07-05 10:46:27

标签: c# nhibernate entity-framework orm

我的SQL Server数据库中有3个表:

  • 教师
  • 学生

这些表中的每一个都包含一些列,这些列也可以在其他列中找到,例如:

所有其他列都不同。这是一个遗留数据库。我无法改变它。

在我的C#代码中,我希望:

public partial class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
}

public interface Role
{
}

public partial class Teacher : Role
{   
    public string School { get; set; }
}

public partial class Student : Role
{
    public string YearLevel { get; set; }
}

public partial class Parent : Role
{
    public string Blagh { get; set; }
}

即,Role和Person之间存在多态的多对一关联。

我想要这个的原因是因为一个人既可以是老师也可以是父母。

我的问题是,我应该使用什么技术来填充数据库中的业务对象?

我查看了Entity Framework 4.1 DbContext的内容;我喜欢数据注释方法,但它可以做我想要的吗?如果没有,可以使用Fluent API吗?

如果实体框架不能这样做,那么NHibernate(最好使用属性)或Linq-to-SQL怎么样?

我知道NHibernate可以处理多态关联,但这可以在我们在像这里的实体之间拆分表的地方完成吗?

1 个答案:

答案 0 :(得分:2)

与实体框架最接近的是TPC inheritance

public abstract class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

public partial class Teacher : Person
{   
    public string School { get; set; }
}

public partial class Student : Person
{
    public string YearLevel { get; set; }
}

public partial class Parent : Person
{
    public string Blagh { get; set; }
}

没有更多因为:

  • 如果没有继承或表拆分,EF无法将多个实体映射到同一个表
  • EF无法将多个关系映射到单个导航属性
  • 老师和家长将永远是两个不相关的人。

我怀疑NHibernate是否支持这一点,因为你所展示的不是纯粹的多态关联(人的非确定性映射仍有问题),但也许有人会让我感到惊讶。