我期待使用類似於這裏找到指令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'值? –