繁体   English   中英

实体框架6.1鉴别器TPH

[英]Entity Framework 6.1 Discriminator TPH

我正在寻找使用EF6来实现每层表格的功能,类似于在此处找到的说明: example

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

  • 学生
  • 联系
  • 讲师

当我检查数据库表Users时,将学生对象传递到下面的Save方法中时, 鉴别符列的值为(Undefined) 相反,我希望该值是Student 否则,我的数据将正确保存在“ 用户”和“ 学生”表中。

在对问题进行故障排除时,我向类添加了UserType枚举器Get属性,以确保我从User转换Student

在我的UserRepository类中,下面是我的Save方法。

    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();
    }

替代失败

我已经尝试过类似以下的代码来显式创建一个新的Student

    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");
          }
      }

看来您的映射不适合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("Discriminator").HasValue("STU"))
    .Map<Instructor>(m => m.Requires("Discriminator").HasValue("INS"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM