使用每层次表(TPH)时代码首次映射问题

时间:2014-04-24 11:07:54

标签: entity-framework ef-code-first

在过去的几天里,我们首先开始研究代码,作为其中的一部分,我在进行映射时遇到了一个问题,我在这里用不同的例子进行了总结。如果我得到任何解决方案会更有帮助 为此。

以下是三个实体

课程 - >实体持有关于课程的信息,如费用,描述等,每门课程都会 属于某个类别或类型(即学生,员工等),它指的是在 ParentId 类型 的帮助下进行注册的人专栏

示例:要获得ID为10的学生的课程,sql查询将是

 "select * from course where type=1 and parentid=10"

学生:这里的CourseJoined实体应该只获取学生类型的相关记录(即......)同样适用于员工

首先如何实现这一目标?

我试图在这里实现TPH逻辑,但我得到了异常

 public enum CourseType
    {
        Student = 1,
        Employee = 2
    }

public class Course
{

    public int ID { get; set; }

    public int ParentID { get; set; }

    public decimal Amount { get; set; }

    public CourseType Type { get; set; }

    public string Description { get; set; }

}

public class StudentCourse : Course
{
}

public class EmployeeCourse : Course
{
}


public class Student
{

    public int ID { get; set; }

    public string Name { get; set; }

    public virtual ICollection<StudentCourse> CourseJoined { get; set; }




}

public class Employee
{
    public int ID { get; set; }

    public string Name { get; set; }

    public string WorkingAs { get; set; }

    public string Experiance { get; set; }

    public virtual ICollection<EmployeeCourse> CourseJoined { get; set; }
}

例外:

  

外键组件&#39; ParentID&#39;不是声明的财产   键入&#39; EmployeeCourse&#39;。验证它是否未明确   从模型中排除,并且它是一个有效的原始属性。

2)为避免该错误,我从课程表中删除了ParentID 在我发现下面的迁移脚本

后,将它们放在StudentCourse和EmployeeCourse中
CreateTable(
                "dbo.Course",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Amount = c.Decimal(nullable: false, precision: 18, scale: 2),
                        Type = c.Int(),
                        Description = c.String(),
                        ParentID = c.Int(),
                        ParentID1 = c.Int(),
                    })
                .PrimaryKey(t => t.ID)
                .ForeignKey("dbo.Employee", t => t.ParentID, cascadeDelete: true)
                .ForeignKey("dbo.Student", t => t.ParentID1, cascadeDelete: true)
                .Index(t => t.ParentID)
                .Index(t => t.ParentID1);

其中为课程创建了两列但我不想要两列(t.ParentID和t.ParentID1),我只想要ParentID,我将插入学生和员工ID。

有人可以指导我修改上述或任何建议以实施上述方案吗?

我正在使用EF 6.0版本。

0 个答案:

没有答案