如何首先在实体框架代码中为每个类型配置多个对象集
本文关键字:类型 配置 对象 何首先 实体 框架 代码 | 更新日期: 2023-09-27 17:59:37
我正在使用Entity Framework 5 code first
。在我的数据库中,我有两个表,AvailPayPeriods
和AvailPayPeriodsWeekly
。它们看起来都一样:
Period datetime not null
因为这两个表本质上是相同的,我决定创建以下类来表示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
的类吗?
您可以添加以下类:
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时会发生错误。当这种情况发生时,实体框架无法解析要用于PayPeriod实体的DbSet实例。使用单独的类可以使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; }
请参阅相关内容:实体框架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)。