Как сначала настроить несколько наборов объектов для каждого типа в коде 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).