实体框架4.1,每种类型的表继承

时间:2011-12-24 19:25:11

标签: inheritance code-first table-per-type

有人可以建议针对C#限制的解决方法吗?我需要两种不同的类型来源于相同的基类型。在我的例子中,员工和用户是人。员工也可以是用户(反之亦然)。这似乎是多重继承,C#不支持。我查看了http://www.codeproject.com/KB/architecture/smip.aspx,这似乎不符合我的情况。

public abstract class Person
  {

    public int ID { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }
  }

  public class Employee : Person
  {

    public string Number { get; set; }

    public System.DateTime HireDate { get; set; }
  }

  public class User : Person
  {

    public string Password { get; set; }

    public bool Active { get; set; }
  }

  public class CfTestContext : DbContext
  {

    public DbSet<Employee> Employees { get; set; }

    public DbSet<User> Users { get; set; }

    public DbSet<Person> People { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

      modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

      modelBuilder.Entity<Person>().ToTable("People");

      modelBuilder.Entity<Employee>().ToTable("Employees");

      modelBuilder.Entity<User>().ToTable("Users");
    }
  }

  public class CreateCfTestDatabase : DropCreateDatabaseAlways<CfTestContext>
  {

    protected override void Seed(CfTestContext context)
    {

      // Abraham Lincoln hired as an Employee on February 12th.

      // Abraham doesn't need access as a User because he doesn't use the Purchasing application.

      context.Employees.Add(new Employee { Name = "Abraham Lincoln", Email = "abraham@microsoft.com", Number = "107124", HireDate = System.DateTime.Parse("2/12/2000") });

      // George Washington added as a User on July 4th.

      // George is a consultant, so he will never become an Employee.

      context.Users.Add(new User { Name = "George Washington", Email = "george@microsoft.com", Password = "xT76#a2", Active = true });

      context.SaveChanges();

      // Make Abraham Lincoln a User on September 29th.

      // Abraham received training and now needs to use the Purchasing application

      Employee employee = context.Employees.Where(t => t.Name == "Abraham Lincoln").FirstOrDefault();

      context.Users.Add(new User { Password = "C1x$av38", Active = true,  ID = employee.ID });  // this does not produce the desired results.

      context.SaveChanges();

      base.Seed(context);
    }
  }

1 个答案:

答案 0 :(得分:1)

你是对的,不可能在C#中创建多个继承对象。但是您可以通过在模型中创建ComplexType(例如Login)来解决此问题,并添加Password和Active属性,将Login属性添加到person对象。然后,您可以通过检查Person对象上的Login.Active来检查用户是否具有活动的登录信息。