2011-01-30 4 views
18

मेरे पास एक डेटाबेस है और मैं 2 अलग-अलग स्कीमा का उपयोग कर रहा हूं। स्कीमा नामस्थान की तरह हैं (अगर मैं गलत हूं तो मुझे सही करें)। इस तरह मेरे पास 1 डीबी है और वर्तमान में 2 स्कीमा हैं ... इसलिए 1 स्कीमा में टेबल को अन्य स्कीमा में टेबल के समान ही नामित किया जा सकता है क्योंकि वे अलग-अलग स्कीमा में हैं।इकाई फ्रेमवर्क 4: कोड पहले - किसी अन्य स्कीमा में डीबी बनाना? MapSingleType?

मैं एक अलग स्कीमा से बात करने के लिए पहले ईएफ कोड कैसे प्राप्त करूं और डिफ़ॉल्ट स्कीमा नहीं?

क्या यह मैपसिंटल टाइप के साथ कुछ करने के लिए somethign है और एक विधि overriding या मैं कुछ और कर सकता हूँ?

किसी भी मदद की वास्तव में सराहना की।

उत्तर

10

आप इन नियमों का पालन लागू कर सकते हैं:

public class DefaultSchemaConvention : 
      IConfigurationConvention<Type, EntityTypeConfiguration> 
{ 
    string defaultSchema; 
    public DefaultSchemaConvention(string defaultSchema) 
    { 
     if (String.IsNullOrWhiteSpace(defaultSchema)) 
      throw new ArgumentException("defaultSchema"); 
     this.defaultSchema = defaultSchema; 
    } 

    void IConfigurationConvention<Type, EntityTypeConfiguration>.Apply(
     Type memberInfo, Func<EntityTypeConfiguration> configuration) 
    { 
     EntityTypeConfiguration cfg = configuration(); 
     string tableName = cfg.EntitySetName; 
     if (String.IsNullOrEmpty(tableName)) 
      tableName = memberInfo.Name; 
     cfg.ToTable(tableName, this.defaultSchema); 
    } 
} 

उपयोग:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.Edm.Db.ColumnTypeCasingConvention>(); 
    modelBuilder.Conventions.Add(new DefaultSchemaConvention("TEST")); 
} 

वहाँ आर्थर विकर्स here से कंधा मिलाकर नोटों की एक जोड़ी टीपीटी विरासत और कई-से-अनेक संबंध के विषय में है।

+1

आपकी मदद के लिए धन्यवाद के साथ सौदा मदद की। – Martin

+4

अफसोस की बात यह अब काम नहीं करती है, ऐसा लगता है जैसे ईएफ 4.1 हटाया गया 'आईकोनफिगरेशन कॉन्वेन्शन'। – Omar

+0

अब आप अपने डीबीकॉन्टेक्स्ट में ऑनमोडेल क्रिएटिंग को ओवरराइड कर सकते हैं और modelBuilder.Entity () का उपयोग कर किसी तालिका में एक इकाई को मैप कर सकते हैं। ToTable ("MyTableName", "MySchemaName"); – hnafar

1

यहां एक उदाहरण है कि इकाई मॉडल ढांचे को अपने मॉडल के नामस्थानों के आधार पर टेबल स्कीमा का उपयोग कैसे करें। उदाहरण के लिए यदि आपके पास मॉडल RiaLib.Data.Models.Membership.User है तो संबंधित डीबी तालिका को [सदस्यता] कहा जाएगा। [उपयोगकर्ता] [dbo] के बजाय [उपयोगकर्ता]। [उपयोगकर्ता]।

public class DatabaseContext : DbContext 
{ 
    public DbSet<Membership.User> Users { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Add(new TableSchemaConvention()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

https://github.com/rialib/efextensions>TableSchemaConvention.cs

7

मैं CodeFirst मॉडल के बारे में पता नहीं है, लेकिन "तालिका" के लिए DataAnnotation एक स्कीमा विकल्प भी शामिल है। मेरे कोड इस तरह पढ़ता है:

<Table("Product", Schema:="SalesLT")> 
Public Class Product 

End Class 

यह मैं वैकल्पिक स्कीमा

+0

नहीं, यह अब और प्रतीत नहीं होता है। मेरी इच्छा है कि यह किया। – Kahanu

+0

धन्यवाद! ईएफ 5.0 के लिए काम करता है। –

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