कोड-प्रथम DbContext से कनेक्शन स्ट्रिंग पास करें


92

मैं इकाई ढांचे के कोड-पहले DbContext से कनेक्शन स्ट्रिंग कैसे पास कर सकता हूं? DbContext और कनेक्शन स्ट्रिंग web.config में एक ही प्रोजेक्ट में होने पर मेरा डेटाबेस जेनरेशन सही तरीके से काम करता है और उसी तरह नाम दिया जाता है। लेकिन अब मुझे DbContext को किसी अन्य प्रोजेक्ट में स्थानांतरित करने की आवश्यकता है, इसलिए मैं एक कनेक्शन स्ट्रिंग को पास करने का परीक्षण कर रहा हूं जो निम्नानुसार है:

मॉडल और संदर्भ

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

कार्य

    public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

यदि मैं एक्शन का विश्लेषण करने के लिए एक ब्रेकपॉइंट सेट करता हूं db, तो कनेक्शन स्ट्रिंग है, लेकिन यह डेटाबेस या कुछ भी नहीं बनाता है या नहीं ढूंढता है।

SQL सर्वर से कनेक्शन स्थापित करते समय नेटवर्क-संबंधी या आवृत्ति-विशिष्ट त्रुटि हुई। सर्वर नहीं मिला था या पहुंच योग्य नहीं था। सत्यापित करें कि उदाहरण का नाम सही है और दूरस्थ कनेक्शन की अनुमति देने के लिए SQL सर्वर कॉन्फ़िगर किया गया है। (प्रदाता: नामित पाइप प्रदाता, त्रुटि: 40 - SQL सर्वर से कनेक्शन नहीं खोल सकता)


क्या आप वाकई सही सर्वर से जुड़ रहे हैं? त्रुटि एक विशिष्ट SQL सर्वर / एक्सप्रेस अपवाद है। लगता है जैसे आप एक Sql CE डेटाबेस से कनेक्शन नहीं कर रहे हैं ... और EF कोड पहले डेटाबेस बना देगा अगर यह मौजूद नहीं है ... जब तक कि पथ शायद नहीं मिल सकता है ...
स्टीवन के।

इसलिए मूल रूप से, ओपी की गलती थी कि पूरे कनेक्शनस्ट्रिंग को सिर्फ नाम के बजाय डीबीकॉन्टेक्स कंस्ट्रक्टर के पास भेजा जाए। जैसा कि दस्तावेज़ कहते हैं: "DbContext (स्ट्रिंग) डेटाबेस के लिए नाम या कनेक्शन स्ट्रिंग के रूप में दिए गए स्ट्रिंग का उपयोग करके एक नया संदर्भ उदाहरण का निर्माण करता है"
Göran Roseen

जवाबों:


86

खेल के लिए थोड़ा देर से यहाँ, लेकिन एक और विकल्प है:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}

2
नमस्ते! यही एकमात्र समाधान था जो मुझे कहीं मिला। मेरी समस्या यह है कि मैं web.config के बजाय अपनी Azure कॉन्फ़िगरेशन फ़ाइल से सेटिंग्स लेना चाहूंगा। फिर भी, यह तरीका काम नहीं करता है क्योंकि 'प्रदाता' सेटिंग गायब है (यह web.config में एक विशेषता के रूप में सेट है)। कोई विचार?
उपयोगकर्ता

1
बहुत बढ़िया जवाब! केवल बनाया गया परिवर्तन कॉनस्ट्रिंग पैरामीटर को हटाने के लिए किया गया था, और फिर एप्लिकेशन सेटिंग्स में सहेजे गए कनेक्शन स्ट्रिंग का उपयोग करें। यह। Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString
उपयोगी बॉन्ड

मैं कैसे एक ही समय में पैरामीटर के रूप में दोनों conString और DbCompiledModel ऑब्जेक्ट पास कर सकता हूं?
बेहज़ाद अब्राहिमी

अच्छा लगा। बस "यह" बेमानी है, आप इसे हटा सकते हैं।
टोकविले

1
यदि आपका क्लास मॉड्यूल Manual changes to this file will be overwritten if the code is regenerated.हेडर में शामिल है, तो एक आंशिक वर्ग और विधियों (सी # प्रोग्रामिंग गाइड) के
woodvi

59

डॉक्स पढ़ने के बाद, मुझे इसके बजाय कनेक्शन स्ट्रिंग का नाम देना होगा:

var db = new NerdDinners("NerdDinnerDb");

मैंने इसे अपने कंस्ट्रक्टर में डाल दिया और इसे कहीं और संदर्भ के लिए जरूरी होने पर सार्वजनिक रूप से स्थिर बना दिया।
टोनी वॉल

37

सोचा कि मैं इस बिट को उन लोगों के लिए जोड़ दूंगा जो "DbContext के लिए कनेक्शन स्ट्रिंग कैसे पास करें" की तलाश में आते हैं: आप अपने अंतर्निहित डेटास्टोर के लिए एक कनेक्शन स्ट्रिंग का निर्माण कर सकते हैं और पूरे कनेक्शन स्ट्रिंग कोbbontext से प्राप्त अपने प्रकार के कंस्ट्रक्टर को पास कर सकते हैं ।

(@ लोल कोडर से कोड का फिर से उपयोग करना) मॉडल और संदर्भ

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

फिर, जैसे आप SqlConnectioStringBuilder का उपयोग करके एक Sql कनेक्शन स्ट्रिंग का निर्माण करते हैं:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

जहां GetConnectionString विधि उपयुक्त कनेक्शन स्ट्रिंग का निर्माण करती है और SqlConnectionStringBuilder सुनिश्चित करता है कि कनेक्शन स्ट्रिंग सही रूप से सही है; फिर आप अपने db कॉन्टेक्स्ट को इस तरह से इंस्टेंट कर सकते हैं:

var myContext = new NerdDinners(builder.ToString());

4
वास्तव में हार्ड कोड कनेक्शन स्ट्रिंग मैंने किया था:public TestAppContext() : base("Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True") { }
एलिजाह डब्ल्यू। गगन

28

अपने DbContext में, अपने DbContext के लिए एक डिफ़ॉल्ट कंस्ट्रक्टर बनाएं और आधार को इस तरह से वारिस करें:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }

1
मेरे मामले में, यह एक DB नाम बनाता है MyConnectionString... (हाँ कनेक्शन स्ट्रिंग मौजूद है)। मुझे लगाना पड़ेगा name=MyConnectionString
Matthieu Charbonnier

2

यदि आप ऐप के भीतर कनेक्शन स्ट्रिंग का निर्माण कर रहे हैं, तो आप अपने कमांड का उपयोग करेंगे। यदि आप वेब कॉन्फ़िगरेशन में कनेक्शन स्ट्रिंग का उपयोग कर रहे हैं। फिर आप उस स्ट्रिंग के "नाम" का उपयोग करें।


2

मेरे पास उस समस्या के लिए एक छोटा सा समाधान उदाहरण है।

MyDBContext.cs

 public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
  {
      if(ConnectionType==DBConnectionType.MainConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
       }
      else if(ConnectionType==DBConnectionType.BackupConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
       }
  }

MyClass.cs

public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }

frmMyForm.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);

1

Web.config में अपने कनेक्शन स्ट्रिंग के सिंटैक्स की जाँच करें। यह कुछ ऐसा होना चाहिएConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"


कनेक्शन स्ट्रिंग तब काम करती है जब वे दोनों एक ही प्रोजेक्ट में एक ही नाम का उपयोग करते हैं।
शॉन मैक्लेन

यह काम नहीं करता है जब मैं मैन्युअल रूप से इसे DbConext में भेजना चाहता हूं
Shawn Mclean

कनेक्शन स्ट्रिंग ठीक है, पथ को निरपेक्ष होने की आवश्यकता नहीं है।
स्टीवन के।

1

ईएफ मॉडल का उपयोग करते समय, मेरे पास प्रत्येक प्रोजेक्ट में एक कनेक्शन स्ट्रिंग है जो ईएफ मॉडल का उपभोग करता है। उदाहरण के लिए, मेरे पास एक अलग वर्ग के पुस्तकालय में ईएफ ईडीएमएक्स मॉडल है। मेरी वेब (mvc) परियोजना में एक कनेक्शन स्ट्रिंग है ताकि वह EF db तक पहुंच सके।

मेरे पास रिपॉजिटरी के परीक्षण के लिए एक और यूनिट टेस्ट प्रोजेक्ट भी है। EF db को एक्सेस करने के लिए रिपॉजिटरी के लिए टेस्ट प्रोजेक्ट की ऐप.कॉन्फिग फाइल में एक ही कनेक्शन स्ट्रिंग है।

DB कनेक्शन कॉन्फ़िगर किए जाने चाहिए, कोडित नहीं, IMO।


2
मुझे कोड द्वारा मैन्युअल रूप से कनेक्शन स्ट्रिंग पास करने की आवश्यकता है। मैं निर्भरता इंजेक्शन का उपयोग कर रहा हूँ।
शॉन मैक्लेन

1

से यहाँ

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["BloggingDatabase"].ConnectionString);
    }

नोट आपको जोड़ने की आवश्यकता हो सकती है Microsoft.EntityFrameworkCore.SqlServer


0

आपके कोड में कुछ भी गलत नहीं देखा जा सकता है, मैं SqlExpress का उपयोग करता हूं और यह ठीक काम करता है जब मैं कंस्ट्रक्टर में कनेक्शन स्ट्रिंग का उपयोग करता हूं।

आपने अपनी परियोजना में एक App_Data फ़ोल्डर बनाया है, है न?


0

जो कोई भी यहाँ आया था, उसके लिए कनेक्शन स्ट्रिंग डायनामिकल सेट करने का तरीका जानने की कोशिश कर रहा था, और ऊपर दिए गए समाधानों से परेशान हो गया था (जैसे कि "इनिशियलाइज़ेशन स्ट्रिंग का प्रारूप इंडेक्स 0. पर शुरू होने वाले विनिर्देश के अनुरूप नहीं है") कनेक्शन स्ट्रिंग सेट करते समय। निर्माता। इसे कैसे ठीक किया जाए:

public static string ConnectionString
{
    get {
        if (ConfigurationManager.AppSettings["DevelopmentEnvironment"] == "true")
            return ConfigurationManager.ConnectionStrings["LocalDb"].ConnectionString;
        else
            return ConfigurationManager.ConnectionStrings["ExternalDb"].ConnectionString;
    }
}

public ApplicationDbContext() : base(ConnectionString)
{
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.