2011-05-04 14 views
5

यह मेरी स्थिति है, बहुत सरल है।इकाई फ्रेमवर्क में int के लिए भेदभाव कॉलम बदलना 4.1

मेरी कक्षाएं;

public class ClassBase 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
} 

public class ClassMiddle1 : ClassBase 
{ 

} 

public class ClassMiddle2 : ClassBase 
{ 
    public Guid Token { get; set; } 
} 

public class ClassA : ClassMiddle1 
{ 
    public string UserId { get; set; } 
    public string Username { get; set; } 
} 

public class ClassB : ClassMiddle2 
{ 
    public string Username { get; set; } 
} 

और मेरा ऑनमोडेल क्रिएटिंग;

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ClassBase>() 
     .Map(m => { 
      m.Properties(p => new { p.Id}); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassMiddle1>() 
     .Map<ClassMiddle1>(m => 
     { 
      m.Properties(p => new { }); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassMiddle2>() 
     .Map<ClassMiddle2>(m => 
     { 
      m.Properties(p => new { p.Token }); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassA>() 
     .Map<ClassA>(m => 
     { 
      m.Properties(p => new 
      { 
       p.UserId, 
       p.Username 
      }); 
      m.ToTable("TableA"); 

     }); 

    modelBuilder.Entity<ClassB>() 
     .Map<ClassB>(m => 
     { 
      m.Properties(p => new 
      { 
       p.Username 
      }); 
      m.ToTable("TableB"); 

     }).Property(p => p.Username).HasColumnName("User"); 

} 

यह ठीक काम करता है लेकिन डिस्कमिनेटर कॉलम डिफ्रिमिनेटर, NVARCHAR (128) डिफ़ॉल्ट रूप से होता है। मैंने पढ़ा है कि नीचे दिए गए कुछ का उपयोग करके इस कॉलम को स्वयं परिभाषित करना संभव है।

m.Requires("ClassType").HasValue(1); 

मैंने अपनी संभावनाओं को अंदर से बदल दिया लेकिन हर बार एक मृत अंत में चल रहा था। किसी को भी सुझाव है कि यह कैसे करें?

मैं एक और प्रश्न के साथ समाप्त हो जाऊंगा। चूंकि हमारे पदानुक्रम बहुत ऊपर हैं, लेकिन सी, डी, ई, एफ जैसे और भी अधिक व्युत्पन्न वर्ग ... पी कहते हैं। हमने पाया कि ईएफ इस अविश्वसनीय रूप से बड़ी डेटाबेस क्वेरी (~ 150 के) बना रहा है। कोई और इस परिदृश्य में भाग गया?

मैं कम से कम इसे कम करने के लिए डिस्कमिनेटर बदलने के साथ उम्मीद कर रहा हूं। इसके द्वारा मैं कहता हूं कि हमारे पास एक बहुत साफ वर्ग पदानुक्रम है लेकिन एक बदसूरत क्वेरी सेट है।

उत्तर

5

देर जवाब कैसे वास्तविक समाधान हो गया। केवल इसे यहां लिखना क्योंकि इस के आसपास के दस्तावेज को ढूंढना इतना आसान नहीं था।

मेरे समाधान नीचे की तरह समाप्त हो गया ...

modelBuilder.Entity<ClassBase>() 
     .Map(m => { 
      ... 
      m.Requires("Discriminator").HasValue(1) 
     }); 
1

आपकी "अविश्वसनीय रूप से बड़ी डेटाबेस क्वेरी" के संबंध में: वास्तव में performance and query generation issues with TPT inheritance mapping हैं। अभी भी उन समस्याओं, केवल इस अस्पष्ट घोषणा (अगस्त 2010) के लिए एक ठीक होने के लिए प्रतीत नहीं होता:

अच्छी खबर यह है कि हम इन मुद्दों पर काम कर रहे हैं ताकि एफई नहीं रह गया है अनावश्यक एसक्यूएल उत्पन्न करता है । खराब समाचार यह है कि फिक्स को भविष्य में रिलीज़ में डिलीवर करने से पहले कुछ समय लेगा।

(ऊपर लिंक लेख से उद्धरण।)

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