2014-07-18 63 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

相關問題