我首先使用代码通过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指令或程序集引用?)
答案 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);