如何首先在实体框架代码中为每个类型配置多个对象集

本文关键字:类型 配置 对象 何首先 实体 框架 代码 | 更新日期: 2023-09-27 17:59:37

我正在使用Entity Framework 5 code first。在我的数据库中,我有两个表,AvailPayPeriodsAvailPayPeriodsWeekly。它们看起来都一样:

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映射到它们各自的表?

我应该创建名为WeeklyPayPeriodMonthlyPayPeriod的类吗?

如何首先在实体框架代码中为每个类型配置多个对象集

您可以添加以下类:

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)。