Entity Framework 4.1, таблица для каждого типа наследования - PullRequest
1 голос
/ 24 декабря 2011

Может кто-нибудь предложить обходной путь для ограничения 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 Ответ

1 голос
/ 25 декабря 2011

Вы правы, в C # нет возможности создать объект множественного наследования.Но вы можете решить эту проблему, создав ComplexType в вашей модели (например, Login) и добавив свойство Password и Active, добавив свойство Login к объекту person.Затем вы можете проверить, есть ли у пользователя активная информация для входа, проверив Login.Active для объекта Person.

...