2014-07-18 64 views
0

我期待使用类似于这里找到指令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"); 
      } 
     } 
+0

我认为这个问题是你的基本类型不是抽象的。 –

+0

@ErikPhilips我的_User_类被指定为:'public abstract class User' – CyberUnDead

+1

然后这个代码不应该存在:'case UserType.Role.Base:_db.Users.Add(user);'。但是,如何设置'user.Role'值? –

回答

0

看来你的映射是不正确的TPH。在你的问题的链接例子显示:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<BillingDetail>() 
    .Map<BankAccount>(m => m.Requires("BillingDetailType").HasValue("BA")) 
    .Map<CreditCard>(m => m.Requires("BillingDetailType").HasValue("CC")); 
} 

,你的问题仿照可能看起来像:

modelBuilder.Entity<User>() 
    .Map<Student>(m => m.Requires("Descriminator").HasValue("STU")) 
    .Map<Instructor>(m => m.Requires("Descriminator").HasValue("INS")); 
+0

我在TPH和TPT之间混合了我的方法,所以当插入简单的_Administrator_类时,它使用* Discriminator *列,而其他子类不使用列,而是将其数据放入单独的适当表中。 [简明文档](http://msdn.microsoft.com/en-us/data/jj591617.aspx#2.4) – CyberUnDead

相关问题