7

を使用してEntity Framework 5 code firstいます。私のデータベースには、2 つのテーブルAvailPayPeriodsAvailPayPeriodsWeekly. どちらも同じように見えます:

Period datetime not null

これら 2 つのテーブルは本質的に同一であるため、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ますか?

4

2 に答える 2

7

次のクラスを追加できます。

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");
                                                       });

}

完璧ではありませんが、仕事は終わります。

于 2013-02-15T12:56:08.057 に答える
1

Following on from the accepted answer the error occurs from declaring DbSet twice with the same type. When this occurs the entity framework can't resolve which DbSet instance to use for PayPeriod entities. Using separate classes allows EF to resolve to the correct 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; }

See Related: Entity Framework 4 Code Only Error “Multiple objects sets per type are not supported”</a>

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 For implementing Table Per Concrete Type Mappings (TPC).

于 2014-05-27T00:48:28.157 に答える