实体框架TPT继承编辑基类表中的记录并将其绑定到子类表

时间:2014-02-01 12:14:45

标签: entity-framework

我首先使用代码通过TPT继承链接到现有数据库这里的代码我有一个名为Person的基类和2个子类,名为Student和Teacher,Student和Teacher类都继承自Person类

public class Person
    {
        public int PersonId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

    }
public class Student : Person
    {
        public int? Payment { get; set; }
    }


public class Teacher : Person
    {
        public int Wage { get; set; }
    }

这是我的Context Class

public class PersonContext : DbContext
    {
        public PersonContext()
            : base("TPT")
        {
            Database.SetInitializer<PersonContext>(null);
        }
        public DbSet<Person> Persons { get; set; }
        public DbSet<Student> Students { get; set; }
        public DbSet<Teacher> Teachers { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Person>().ToTable("Persons");
            modelBuilder.Entity<Teacher>().ToTable("Teachers");
            modelBuilder.Entity<Student>().ToTable("Students");
        }
    }

我已经使用FirstName和LastName插入了一条记录,并通过在上下文中添加一个简单的Persons实例将其保存在Person表中。这是因为我不知道那个时代的人的类型。在另一个列表中,操作员识别该记录,并尝试向其添加额外数据(例如为学生添加付款)。我现在应该怎么做?如果我获得该人的记录并将其转发到Student课程并尝试更新它,我将收到此错误:

  

'TablePerTypeInheritance.Models.Person'不包含定义   对于“付款”,没有延期方法“付款”接受第一个   “TablePerTypeInheritance.Models.Person”类型的参数可以是   发现(您是否缺少using指令或程序集引用?)

2 个答案:

答案 0 :(得分:2)

您保存了Person类型的记录,因此始终会将其作为Person从数据库中检索。

在C#中,您无法将基类强制转换为派生类。这样的操作无效。

var person = new Person();
var student = (Student)Person; // doesn't compile

如果要更改记录的类型,则必须创建所需类型的新对象。

var person = context.Persons.Find(1);
var student = new Student() {
    FirstName = person.FirstName,
    LastName = pesron.LastName
};

context.Persons.Remove(person);
context.Student.Add(student);

答案 1 :(得分:-1)

您的朋友,您必须使用自己的sql命令才能执行此操作。

var id = new SqlParameter("@id", std.StudentId);
var rate = new SqlParameter("@rate", std.Rate);
contex.Database.ExecuteSqlCommand("insert into ExcelentSudents values (@id,@rate)", id, rate);