【问题标题】:polymorphic association and splitting tables多态关联和拆分表
【发布时间】:2011-07-05 10:46:27
【问题描述】:

我的 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 可以处理多态关联,但是这可以在我们像这里这样在实体之间拆分表的情况下完成吗?

【问题讨论】:

    标签: c# nhibernate entity-framework orm


    【解决方案1】:

    您可以使用实体框架获得的最接近的是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 是否支持这一点,因为您显示的不是纯粹的多态关联(Person 的非确定性映射仍然存在问题)但也许有人会让我感到惊讶。

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2014-03-24
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多