7

私はEntity Framework 5 code firstを使用しています。私のデータベースには、2つのテーブル、AvailPayPeriodsAvailPayPeriodsWeeklyがあります。どちらも同じように見える:Entity Frameworkコードでタイプごとに複数のオブジェクトセットを構成する方法

Period datetime not null 

これらの2つのテーブルは、私は2の1のいずれかを表すために以下のクラスを作成することにした自然の中で同一であるため:

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

    public DateTime Period { get; set; } 
} 

私が設定するために苦労しています2. I自分のデータベースコンテキストクラスで、次があります。

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を改正:

答えて

7

次のクラスを追加することができ

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

} 

完璧ではないが、仕事を取得します。

+0

「Discriminator」フィールドを避けるように、PayPeriodクラスを抽象クラスとしてマークすることもできます。具体的な表(TPC)を参照してください。http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code -first.aspx – Adi

1

エラーが発生した後、同じ種類のDbSetを2回宣言するとエラーが発生します。これが起きると、エンティティフレームワークは、どの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 Code Only Error “Multiple objects sets per type are not supported”コンクリート型マッピング(TPC)毎のテーブルを実装するための

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

関連する問題