2015-02-09 6 views
5

मुझे निम्न समस्या है। मैं एंटिटी फ्रेमवर्क 6 का उपयोग कर रहा हूं और मैं रनटाइम पर इस्तेमाल किए गए डेटाबेस को बदलने में सक्षम होना चाहता हूं या कम से कम मैं विकल्पों में दर्ज होने पर कनेक्शन जानकारी जांचने में सक्षम होना चाहता हूं। मेरी समस्या यह है कि हम MySQL और LocalDB v12.0 का समर्थन करना चाहते हैं, इसलिए कनेक्शन स्ट्रिंग का आदान-प्रदान इतना सरल नहीं है - मुझे ExecutionStrategy और ConnectionFactory का आदान-प्रदान करना है।एकाधिक डेटाबेस/कनेक्शन का उपयोग करते हुए EntityFramwork

ईएफ सभी कॉन्फ़िगरेशन को लॉक करने लगता है, इसलिए मैं इसे रनटाइम पर बदलने में सक्षम नहीं हूं, क्या इसके लिए कोई कामकाज है? इस पल के लिए मैंने कई डीबी कॉन्फ़िगरेशन बनाने की कोशिश की है और [DbConfigurationType(typeof(LocalDbConfigruation))] की परिभाषा के साथ प्रत्येक कॉन्फ़िगरेशन के लिए एक संदर्भ प्राप्त किया है।

मैं इस उम्मीद विफल है, लेकिन मैं इसे एक कोशिश के लायक हो जाएगा thougt;)

हो सकता है कि वहाँ कोई नहीं है जो मुझे कुछ tipps और चालें के साथ कर सकते हैं।

उत्तर

0

ठीक है, समस्या अब हल हो रही है। मैं अब डीबीकनेक्शन के साथ काम कर रहा हूं।

public MyContext() : base(ConnectionManager.Connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

public MyContext(DbConnection connection) : base(connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

मैं एक विशेष कक्षा में डीबीकनेक्शन बनाता हूं, मुझे लगता है कि यहां कोड पोस्ट करना उचित नहीं होगा। लेकिन यह मूल रूप से ऐसा कुछ करता है:

DbConnection conn = null; 

switch (Type) 
{ 
    case ConnectionType.LocalDB: 
     conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection(); 
     break; 
    case ConnectionType.MySql: 
     conn = DbProviderFactories.GetFactory("MySql.Data.MySqlClient").CreateConnection(); 
     break; 
    default: 
     throw new System.InvalidOperationException(); 
} 

conn.ConnectionString = "Add provider specific connection string here"; 

तब आपको संदर्भ को कोड को किसी भी तरह देना होगा। मेरे मामले में मेरे पास एक कनेक्शन मैनेजर है जहां से मैंने "डिफॉल कनेक्शन" पढ़ा है जब मैं MyContext() को कॉल करता हूं और एक दूसरा सीटीओआर है जिसे मैं "टेस्ट कनेक्शन" के लिए कॉल करता हूं।

1

एक और विकल्प है जो आधार संदर्भ का उपयोग करता है। नीचे दिए गए उदाहरण में मैं एमएसएसएलएल कनेक्शन और ओरेकल कनेक्शन का उपयोग कर रहा हूं। हालांकि आप चाहें तो कई डेटाबेस कनेक्शन प्रकारों के लिए मूल संदर्भ बढ़ा सकते हैं। यह विधि अन्य महान संभावनाओं का एक टन खुलती है, लेकिन इसे आपकी स्थिति के लिए भी काम करना चाहिए।

BaseContext.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 

     public BaseContext(string connectionString = "Name=MSSQLEntities") 
      : base(connectionString) 
     {} 
    } 
} 

MSSQLModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context will use default MSSQLEntities connection 
    public class MSSQLContext : BaseContext<MSSQLContext> 
    { 
     ...apply DbSet<> and other loveliness...   
    } 
} 

OracleModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context 
    public class OracleContext : BaseContext<OracleContext> 
    { 
     // Declare Oracle connection in Constructor to override default 
     // MSSQL connection 
     public OracleContext() 
      : base("Name=OracleEntities") 
     { } 
     ...apply DbSet<> and other loveliness...   
    } 
} 
+0

धन्यवाद, मैं अपने soluition उपयोग करने पर विचार करेंगे, ऐसा लगता है काफी अच्छा :) – SirBirne

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