首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6.1鉴别器TPH

实体框架6.1鉴别器TPH
EN

Stack Overflow用户
提问于 2014-07-18 21:10:25
回答 1查看 2.7K关注 0票数 0

我希望使用EF6实现每个层次的表,类似于在这里找到的说明:示例

我有一个具有以下派生类型的抽象用户基类:

  • 学生
  • 联系方式
  • 指导员

当我将一个学生对象传递到下面的保存方法中时,当我检查数据库表用户时,判别器列值是(未定义)。相反,我希望这个价值是学生。否则,我的数据将正确地保存在“用户”和“学生”表中。

在排除问题时,我向类中添加了一个UserType枚举器Get属性,以确保我从用户转换到了学生。

在我的UserRepository类中,我的保存方法如下所示。

代码语言:javascript
复制
    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();
    }

失败的替代

我尝试过像下面这样的代码显式地创建一个新的学生。

代码语言:javascript
复制
    private void MapToStudent(User user)
    {
     _db.Users.Add(new Student()
     {
       FirstName = user.FirstName,
       LastName = user.LastName,
       //...
      });
    }

问题

我没投对吧?或者更确切地说,使用EF保存子类的正确/首选方法是什么?

用户基类

代码语言:javascript
复制
      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映射

代码语言:javascript
复制
      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");
          }
      }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-18 21:55:12

您的映射对于TPH似乎是不正确的。您的问题中的链接示例显示:

代码语言:javascript
复制
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"));
}

以您的问题为模型的模式可能如下:

代码语言:javascript
复制
  modelBuilder.Entity<User>()
    .Map<Student>(m => m.Requires("Discriminator").HasValue("STU"))
    .Map<Instructor>(m => m.Requires("Discriminator").HasValue("INS"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24833858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档