কোড-ফার্স্ট DbContext এ সংযোগ স্ট্রিং পাস করুন


92

সত্তা কাঠামোর কোড-প্রথম 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 তবে সংযোগের স্ট্রিং রয়েছে, তবে এটি ডেটাবেস বা কোনও কিছুই তৈরি বা সন্ধান করে না।

এসকিউএল সার্ভারের সাথে সংযোগ স্থাপনের সময় একটি নেটওয়ার্ক-সম্পর্কিত বা উদাহরণ-নির্দিষ্ট ত্রুটি ঘটেছে। সার্ভার পাওয়া যায় না বা প্রবেশযোগ্য ছিল না। উদাহরণটির নামটি সঠিক কিনা এবং দূরবর্তী সংযোগের অনুমতি দেওয়ার জন্য এসকিউএল সার্ভারটি কনফিগার করা হয়েছে তা যাচাই করুন। (সরবরাহকারী: নামযুক্ত পাইপ সরবরাহকারী, ত্রুটি: 40 - এসকিউএল সার্ভারের সাথে কোনও সংযোগ খুলতে পারেনি)


আপনি কি নিশ্চিত যে আপনি সঠিক সার্ভারে সংযোগ করছেন? ত্রুটিটি একটি সাধারণ এসকিউএল সার্ভার / এক্সপ্রেস ব্যতিক্রম। আপনি কোনও এসকিএল সিই ডাটাবেসের সাথে সংযোগ স্থাপন করছেন বলে মনে হচ্ছে না ... এবং ইএফ কোড প্রথমে ডাটাবেসটি উপস্থিত না থাকলে এটি তৈরি করবে ... যদি পথটি সম্ভবত খুঁজে না পাওয়া যায় ...
স্টিভেন কে।

সুতরাং মূলত, ওপির ভুলটি ছিল কেবল সংযোগের পরিবর্তে পুরো সংযোগটি DbContaxt নির্মাণকারীর কাছে প্রেরণ করা। ডকুমেন্টেশন যেমন বলে: "DbContext (স্ট্রিং) ডাটাবেসের জন্য নাম বা সংযোগের স্ট্রিং হিসাবে প্রদত্ত স্ট্রিংটি ব্যবহার করে একটি নতুন প্রসঙ্গ উদাহরণ তৈরি করে"
গোরান রোসেন

উত্তর:


86

এখানে খেলায় কিছুটা দেরি হলেও অন্য বিকল্পটি হ'ল:

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

4
ওহে! এটিই ছিল একমাত্র সমাধান যা আমাকে কোথাও পেয়েছে। আমার সমস্যাটি হ'ল আমি ওয়েবআর কনফিগের পরিবর্তে আমার Azure কনফিগারেশন ফাইল থেকে সেটিংস নিতে চাই। তবুও, 'সরবরাহকারী' সেটিংসটি অনুপস্থিত হওয়ায় (ওয়েলকনফাইগের ক্ষেত্রে এটি একটি অ্যাট্রিবিউট হিসাবে সেট করা আছে) এই ভাবে কাজ করে না। কোন ধারনা?
ব্যবহারকারী

4
দুর্দান্ত উত্তর! কেবলমাত্র পরিবর্তনটি হ'ল সংযোগ স্ট্রিং প্যারামিটারটি সরিয়ে ফেলা এবং তারপরে অ্যাপ্লিকেশন সেটিংসে সংরক্ষিত সংযোগের স্ট্রিংটি ব্যবহার করুন .... এটির ডেটাবেস.কনেকশন.কনেকশনস্ট্রিং = প্রোপার্টি.সেটেটিংস.ডাফল্ট.কনেকশনস্ট্রিং
দরকারী দেখুন

আমি কীভাবে প্যারামিটারের একই সময়ে সংযোগ এবং DbCompiledModel উভয় বস্তুটি পাস করতে পারি?
বেহজাদ ইব্রাহিমি

ভাল লাগল কেবল "এটি" অপ্রয়োজনীয়, আপনি এটি মুছে ফেলতে পারেন।
টোক্কোভিল

4
যদি আপনার ক্লাস মডিউলটি Manual changes to this file will be overwritten if the code is regenerated.শিরোনামে অন্তর্ভুক্ত থাকে তবে আংশিক শ্রেণি এবং পদ্ধতিগুলি (সি # প্রোগ্রামিং গাইড) অনুসারে কেউ
কাঠবি

59

দস্তাবেজগুলি পড়ার পরে, পরিবর্তে আমাকে সংযোগের স্ট্রিংয়ের নামটি পাস করতে হবে:

var db = new NerdDinners("NerdDinnerDb");

আমি এটি আমার নির্মাতাকে রেখেছি এবং অন্যত্র রেফারেন্সের প্রয়োজন হলে এটি সর্বজনীন ধ্রুবক হিসাবে তৈরি করেছি।
টনি ওয়াল

37

ভেবেছি যারা "DbContext এ সংযোগের স্ট্রিংটি কীভাবে পাস করবেন" সন্ধান করতে এসেছেন তাদের জন্য আমি এই বিটটি যুক্ত করব: আপনি আপনার অন্তর্নিহিত ডেটাস্টোরের জন্য সংযোগের স্ট্রিংটি তৈরি করতে এবং 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; }
}

তারপরে, বলুন যে আপনি এর মতো স্ক্যেলকনেক্টিস্টোস্ট্রিংবিল্ডার ব্যবহার করে একটি এসকিএল সংযোগ স্ট্রিং তৈরি করেছেন:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

যেখানে getConnectionString পদ্ধতি যথাযথ সংযোগের স্ট্রিং তৈরি করে এবং SqlConnectionStringBuilder সংযোগের স্ট্রিংটি সিন্টেক্সিকভাবে সঠিক কিনা তা নিশ্চিত করে; আপনি তারপরে আপনার ডিবি কনটেক্সটটি ইনস্ট্যান্ট করতে পারেন:

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
    {
    }

4
আমার ক্ষেত্রে এটি নামের একটি ডিবি তৈরি করে MyConnectionString... (হ্যাঁ সংযোগের স্ট্রিং বিদ্যমান)। আমি রাখতে হবে name=MyConnectionString
ম্যাথিউ চার্বননিয়ার

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

ওয়েবকনফাইগে আপনার সংযোগের স্ট্রিংয়ের বাক্য গঠনটি পরীক্ষা করুন। এটির মতো কিছু হওয়া উচিতConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"


সংযোগ স্ট্রিং যখন তারা উভয় একই প্রকল্পে একই নাম ব্যবহার করে তখন কাজ করে।
শন ম্লেয়ান

আমি ম্যানুয়ালি এটি ডিবি কনেক্সট
শন

সংযোগ স্ট্রিং ঠিক আছে, পথটি পরম হওয়ার দরকার নেই need
স্টিভেন কে।

1

কোনও ইএফ মডেল ব্যবহার করার সময়, প্রতিটি প্রকল্পে আমার কাছে একটি সংযোগ স্ট্রিং থাকে যা EF মডেলটি গ্রাস করে। উদাহরণস্বরূপ, আমার একটি পৃথক শ্রেণির লাইব্রেরিতে একটি EF EDMX মডেল রয়েছে। আমার ওয়েব (এমভিসি) প্রকল্পে একটি সংযোগ স্ট্রিং রয়েছে যাতে এটি EF ডিবি অ্যাক্সেস করতে পারে।

ভান্ডারগুলি পরীক্ষার জন্য আমার আরও একটি ইউনিট পরীক্ষা প্রকল্প রয়েছে। ভান্ডারগুলি EF db অ্যাক্সেস করার জন্য, পরীক্ষার প্রকল্পের app.config ফাইলটিতে একই সংযোগের স্ট্রিং রয়েছে।

ডিবি সংযোগগুলি কনফিগার করা উচিত, কোডড নয়, আইএমও।


4
কোডের মাধ্যমে সংযোগের স্ট্রিং আমি নিজেই পাস করতে হবে। আমি নির্ভরতা ইনজেকশন ব্যবহার করছি।
শন ম্লেয়ান

1

থেকে এখানে

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

আপনি যোগ করার প্রয়োজন হতে পারে নোট Microsoft.EntityFrameworkCore.SqlServer


0

আপনার কোডের সাথে কোনও ভুল দেখতে পাচ্ছি না, আমি এসকিএলএক্সপ্রেস ব্যবহার করি এবং আমি যখন কনস্ট্রাক্টরে সংযোগের স্ট্রিং ব্যবহার করি তখন এটি ঠিক কাজ করে।

আপনি আপনার প্রকল্পে একটি App_Data ফোল্ডার তৈরি করেছেন, তাই না?


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)
{
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.