c# - 多态关联和拆分表

标签 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之间多态的多对一关联。

我想要这个的原因是因为一个人既可以是老师又可以是 parent 。

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

我看过 Entity Framework 4.1 DbContext 的东西;我喜欢数据注释方法,但它能做我想做的事吗?如果不能,Fluent API 可以吗?

如果 Entity Framework 做不到这一点,那么 NHibernate(最好使用属性)或 Linq-to-SQL 呢?

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

最佳答案

Entity Framework 最接近的是 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 的非确定性映射仍然存在问题)但也许有人会让我感到惊讶。

关于c# - 多态关联和拆分表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6581426/

相关文章:

nhibernate - NHibernate用于企业应用程序?

asp.net-mvc - 在开发期间使用 nhibernate 设置种子数据的建议(不是测试套件)

sql-server - SQL LocalDB 与 SQL Server CE

entity-framework - Entity Framework 继承代码优先

c# - 根据组合框所选项目填充列表框时出现 SQL 语法错误

c# - Winapp (c#) 调用 java 应用程序 -> 设置进度条

c# - Visual Studio 2017 : Run tests with Startup Projects

c# - NHibernate 映射完整性检查

c# - 基于特定属性的 Entity Framework 预加载

c# - 为什么我无法在 Entity Framework 的 SaveChanges() 方法上捕获 SqlException