7

मैं Entity Framework 5 code first का उपयोग कर रहा हूं। मेरे डेटाबेस में मेरे पास 2 टेबल, AvailPayPeriods और AvailPayPeriodsWeekly हैं। वे दोनों एक ही लग रही है: मैं कॉन्फ़िगर करने के लिए संघर्ष कर रहा हूँएंटीटी फ्रेमवर्क कोड में प्रति प्रकार एकाधिक ऑब्जेक्ट सेट को कॉन्फ़िगर कैसे करें

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

    public DateTime Period { get; set; } 
} 

:

Period datetime not null 

मैं दोनों में से किसी 1 2 प्रतिनिधित्व करने के लिए निम्नलिखित वर्ग बनाने का निर्णय लेते क्योंकि इन 2 टेबल प्रकृति में समान हैं 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 नामक कक्षाओं को अलग करने के लिए बनाना चाहिए?

उत्तर

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

} 

सही नहीं है, लेकिन काम किया हो जाता है।

+0

आप श्रेणी पेपरोडीड को सार के रूप में चिह्नित करना चाहते हैं ताकि आप डिस्कमिनेटर फ़ील्ड से बच सकें, टेबल प्रति कंक्रीट क्लास (टीपीसी) देखें: http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code -first.aspx – Adi

1

स्वीकृत उत्तर के बाद त्रुटि एक ही प्रकार के साथ दो बार डीबीसेट को घोषित करने से होती है। जब ऐसा होता है तो इकाई ढांचा यह निर्धारित नहीं कर सकता कि कौन से डीबीसेट उदाहरण पेपरोडीड इकाइयों के लिए उपयोग करना है। अलग-अलग वर्गों का उपयोग करने से ईएफ को सही डीबीसेट को हल करने की अनुमति मिलती है।

//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”

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 प्रति कंक्रीट प्रकार मैपिंग (टीपीसी) टेबल को लागू करने के लिए।

संबंधित मुद्दे