7

Ich verwende Entity Framework 5 code first. In meiner Datenbank habe ich 2 Tabellen, AvailPayPeriods und AvailPayPeriodsWeekly. Sie sehen beide gleich:Wie mehrere Objektmengen pro Typ in Entity Framework Code zuerst konfiguriert werden

Period datetime not null 

Da diese zwei Tabellen identisch sind in der Natur Ich entscheide, die folgende Klasse erstellen zu repräsentieren entweder 1 der 2:

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

    public DateTime Period { get; set; } 
} 

Ich kämpfe die konfigurieren 2. ich habe folgende in meiner Datenbank Kontextklasse:

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 
} 

Meine WeeklyPayPeriodConfiguration Klasse:

class WeeklyPayPeriodConfiguration : EntityTypeConfiguration<PayPeriod> 
{ 
    internal WeeklyPayPeriodConfiguration() 
    { 
      this.ToTable("AvailPayPeriodsWeekly"); 
    } 
} 

Als ich mein Repository nenne sie die wöchentlichen Zahlungszeiträume, um wieder ich die folgende Fehlermeldung erhalten:

Multiple object sets per type are not supported. The object sets 'WeeklyPayPeriods' and 'MonthlyPayPeriods' can both contain instances of type 'ePaySlips.DomainModel.Entities.PayPeriod'. 

Wie kann ich die 2 zu ihren jeweiligen Tabellen ordne?

Soll ich lieber separate Klassen namens WeeklyPayPeriod und MonthlyPayPeriod erstellen?

Antwort

7

Sie könnten die folgenden Klassen hinzu:

public class MonthlyPayPeriod : PayPeriod 
{ 

} 

public class WeeklyPayPeriod : PayPeriod 
{ 

} 

und ändern Sie Ihre DbContext zu:

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

} 

Nicht perfekt, aber bekommt den Job zu erledigen.

+0

Sie möchten vielleicht die Klasse PayPeriod als abstrakt markieren, so dass Sie das Diskriminator-Feld vermeiden, siehe Tabelle pro Concrete-Klasse (TPC): http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code -first.aspx – Adi

1

Nach der akzeptierten Antwort tritt der Fehler auf, wenn DbSet zweimal mit demselben Typ deklariert wird. In diesem Fall kann das Entitätsframework nicht auflösen, welche DbSet-Instanz für PayPeriod-Entitäten verwendet werden soll. Durch die Verwendung separater Klassen kann EF zum richtigen DbSet aufgelöst werden.

//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 Verwandte: Entity Framework 4 Code Only Error “Multiple objects sets per type are not supported”

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 Für Tabelle Per Beton Type Mappings (TPC) zu implementieren.

Verwandte Themen