我期待使用类似于这里找到指令EF6实现表每层次: example。实体框架6.1鉴别TPH
我有一个抽象基类用户与以下派生类型:
- 学生
- 联系
- 导师
当我检查数据库表用户鉴别器列值为(未定义)当我通过一个学生对象进入我的保存方法如下。相反,我期望的价值是学生。否则我的数据被正确保存在用户和学生表中。
在排查故障时我加一个UserType枚举获取财产的类别,以确保我从用户铸造学生。
在我的UserRepository class my 保存方法如下。
public void Save(User user)
{
if (Exists(user.Id))
UpdateUser(user);
else
{
switch (user.Role)
{
case UserType.Role.Base:
_db.Users.Add(user);
break;
case UserType.Role.Student:
_db.Users.Add(user as Student);
break;
case UserType.Role.Instructor:
_db.Users.Add(user as Instructor);
break;
case UserType.Role.Contact:
_db.Users.Add(user as Contact);
break;
}
}
_db.SaveChanges();
}
无法替代
我试着像以下代码来显式地创建一个新的学生。
private void MapToStudent(User user)
{
_db.Users.Add(new Student()
{
FirstName = user.FirstName,
LastName = user.LastName,
//...
});
}
问题
我不是向下转换是否正确?或者说,使用EF保存子类的正确/首选方式是什么?
用户群类
public abstract class User
{
public int Id { get; set; }
//...
}
internal class UserNotFound: User
{
public override UserType.Role Role
{
get
{
return UserType.Role.Base;
}
}
}
public class Student : User
{
//...
public override UserType.Role Role
{
get { return UserType.Role.Student; }
}
}
public class Contact : User
{
//...
public override UserType.Role Role
{
get { return UserType.Role.Contact; }
}
}
public class Instructor : User
{
//...
public override UserType.Role Role
{
get { return UserType.Role.Instructor; }
}
}
DatabaseContext映射
public class DatabaseContext : Context
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().ToTable("Students");
modelBuilder.Entity<Contact>().ToTable("Contacts");
modelBuilder.Entity<Instructor>().ToTable("Instructors");
}
}
我认为这个问题是你的基本类型不是抽象的。 –
@ErikPhilips我的_User_类被指定为:'public abstract class User' – CyberUnDead
然后这个代码不应该存在:'case UserType.Role.Base:_db.Users.Add(user);'。但是,如何设置'user.Role'值? –