Как сначала настроить несколько наборов объектов для каждого типа в коде Entity Framework

Я использую Entity Framework 5 code first. В моей базе данных есть 2 таблицы,AvailPayPeriods и AvailPayPeriodsWeekly. Они оба выглядят одинаково:--12-->

Period datetime not null

поскольку эти 2 таблицы идентичны по своей природе, я решаю создать следующий класс для представления либо 1 из 2:

public class PayPeriod : IEntity
{
     public int Id { get; set; }

     public DateTime Period { get; set; }
}

Я изо всех сил пытаюсь настроить 2. У меня есть следующее В моем классе контекста базы данных:

public DbSet<PayPeriod> WeeklyPayPeriods { get; set; }
public DbSet<PayPeriod> MonthlyPayPeriods { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Configurations.Add(new WeeklyPayPeriodConfiguration());
     // Haven't yet created the configuration file for monthly pay periods
}

мой WeeklyPayPeriodConfiguration класс:

class WeeklyPayPeriodConfiguration : EntityTypeConfiguration<PayPeriod>
{
     internal WeeklyPayPeriodConfiguration()
     {
          this.ToTable("AvailPayPeriodsWeekly");
     }
}

когда я вызываю свой репозиторий, чтобы вернуть еженедельные периоды оплаты я получаю следующую ошибку:

Multiple object sets per type are not supported. The object sets 'WeeklyPayPeriods' and 'MonthlyPayPeriods' can both contain instances of type 'ePaySlips.DomainModel.Entities.PayPeriod'.

как сопоставить 2 с их соответствующими таблицами?

должен ли я скорее создавать отдельные классы под названием WeeklyPayPeriod и MonthlyPayPeriod?

2 ответов


вы можете добавить следующие классы:

public class MonthlyPayPeriod : PayPeriod
{

}

public class WeeklyPayPeriod : PayPeriod
{

}

и измените свой DbContext на:

public DbSet<WeeklyPayPeriod> WeeklyPayPeriods { get; set; }
public DbSet<MnthlyPayPeriod> MonthlyPayPeriods { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<WeeklyPayPeriod>().Map(m =>
                                                       {
                                                           m.MapInheritedProperties();
                                                           m.ToTable("AvailPayPeriodsWeekly");
                                                       });
        modelBuilder.Entity<MonthlyPayPeriod>().Map(m =>
                                                       {
                                                           m.MapInheritedProperties();
                                                           m.ToTable("AvailPayPeriodsMonthly");
                                                       });

}

не идеально, но получает работу.


после принятого ответа возникает ошибка при объявлении DbSet дважды с тем же типом. В этом случае Entity framework не может решить, какой экземпляр DbSet использовать для сущностей PayPeriod. Использование отдельных классов позволяет EF разрешать правильный DbSet.

//Error with DbSet<PayPeriod> defined twice    
public DbSet<PayPeriod> WeeklyPayPeriods { get; set; }
public DbSet<PayPeriod> MonthlyPayPeriods { get; set; }

//EF can resolve to each  DbSet, but can't store the baseclass PayPeriods
public DbSet<WeeklyPayPeriod> WeeklyPayPeriods { get; set; }
public DbSet<MnthlyPayPeriod> MonthlyPayPeriods { get; set; }

См.: Entity Framework 4 код только ошибка "несколько наборов объектов для каждого типа не поддерживаются"

http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx для реализации таблицы для конкретных сопоставлений типов (TPC).