Meneruskan string koneksi ke DbContext kode-pertama

92

Bagaimana cara meneruskan string koneksi ke kerangka kerja entitas DbContext kode pertama? Pembuatan database saya berfungsi dengan benar ketika DbContext dan string koneksi di web.config berada dalam proyek yang sama dan diberi nama dengan cara yang sama. Tapi sekarang saya perlu memindahkan DbContext ke proyek lain jadi saya menguji meneruskan string koneksi ke sana sebagai berikut:

Model & Konteks

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

Tindakan

    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>

Jika saya menetapkan breakpoint dalam tindakan dan menganalisis db, string koneksi ada di sana, tetapi tidak membuat atau menemukan database atau apa pun.

Terjadi kesalahan terkait jaringan atau contoh khusus saat membuat sambungan ke SQL Server. Server tidak ditemukan atau tidak dapat diakses. Verifikasi bahwa nama contoh sudah benar dan SQL Server dikonfigurasi untuk memungkinkan sambungan jarak jauh. (penyedia: Penyedia pipa bernama, kesalahan: 40 - tidak dapat membuka koneksi ke SQL Server)

Shawn Mclean
sumber
Apakah Anda benar-benar yakin Anda terhubung ke server yang benar? Kesalahannya adalah pengecualian SQL Server / Express yang khas. Kedengarannya tidak seperti Anda sedang terhubung ke database Sql CE ... dan EF Code pertama-tama akan membuat database jika tidak ada ... kecuali jika jalurnya mungkin tidak dapat ditemukan ...
Steven K.
Jadi pada dasarnya, kesalahan OP adalah mengirim seluruh connectionstring ke konstruktor DbContaxt, bukan hanya namanya. Seperti yang dikatakan dalam dokumentasinya: "DbContext (String) Membuat instance konteks baru menggunakan string yang diberikan sebagai nama atau string koneksi untuk database"
Göran Roseen

Jawaban:

86

Sedikit terlambat untuk permainan di sini, tetapi opsi lainnya adalah:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
Bitfiddler
sumber
2
Hai! Ini adalah satu-satunya solusi yang membawa saya ke suatu tempat. Masalah saya adalah saya ingin mengambil pengaturan dari file konfigurasi Azure saya, bukan web.config. Namun, cara ini tidak berfungsi karena setelan 'Penyedia' tidak ada (disetel sebagai atribut di web.config). Ada ide?
pengguna
1
Jawaban luar biasa! Satu-satunya perubahan yang dilakukan adalah menghapus parameter connString, dan kemudian menggunakan string koneksi yang disimpan dalam pengaturan aplikasi .... this.Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString
berguna Lihat
Bagaimana cara melewatkan objek connString dan DbCompiledModel pada saat yang sama sebagai parameter?
Behzad Ebrahimi
Bagus. Hanya "ini" yang mubazir, Anda dapat menghapusnya.
tocqueville
1
jika modul kelas Anda termasuk Manual changes to this file will be overwritten if the code is regenerated.dalam tajuk, maka seseorang mungkin ingin menerapkan ini dalam kelas parsial sesuai dengan Kelas dan Metode Parsial (Panduan Pemrograman C #)
woodvi
59

Setelah membaca dokumen, saya harus meneruskan nama string koneksi sebagai gantinya:

var db = new NerdDinners("NerdDinnerDb");
Shawn Mclean
sumber
Saya meletakkannya di konstruktor saya dan menjadikannya konstanta publik jika diperlukan untuk referensi di tempat lain.
Tony Wall
37

Pikir saya akan menambahkan bit ini untuk orang-orang yang datang mencari "Bagaimana cara melewatkan string koneksi ke DbContext": Anda dapat membuat string koneksi untuk datastore yang mendasari dan meneruskan seluruh string koneksi ke konstruktor tipe Anda yang berasal dari DbContext .

(Menggunakan kembali Kode dari @Lol Coder) Model & Konteks

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

Kemudian, katakanlah Anda membuat string Koneksi Sql menggunakan SqlConnectioStringBuilder seperti:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Dimana metode GetConnectionString membangun string koneksi yang sesuai dan SqlConnectionStringBuilder memastikan string koneksi secara sintaks benar; Anda kemudian dapat membuat contoh db conetxt Anda seperti ini:

var myContext = new NerdDinners(builder.ToString());
Sudhanshu Mishra
sumber
4
Untuk benar-benar mengkodekan string koneksi yang saya lakukan:public TestAppContext() : base("Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True") { }
Elijah W. Gagne
28

Di DbContext Anda, buat konstruktor default untuk DbContext Anda dan warisi basis seperti ini:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
Kinh Pham
sumber
1
Dalam kasus saya, ini membuat DB bernama MyConnectionString... (ya, string koneksi ada). Saya harus meletakkan name=MyConnectionString.
Matthieu Charbonnier
2

Jika Anda sedang membangun string koneksi dalam aplikasi, maka Anda akan menggunakan perintah connString. Jika Anda menggunakan string koneksi di konfigurasi web. Kemudian Anda menggunakan "nama" dari string itu.

MKunstman
sumber
2

Saya punya sedikit contoh solusi untuk masalah itu.

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);
Durgesh Pandey
sumber
1

Periksa sintaks string koneksi Anda di web.config. Seharusnya seperti ituConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

kmerkle.dll
sumber
String koneksi berfungsi ketika keduanya menggunakan nama yang sama dalam proyek yang sama.
Shawn Mclean
Tidak berfungsi jika saya ingin meneruskannya secara manual ke DbConext
Shawn Mclean
String koneksi baik-baik saja, jalurnya tidak harus absolut.
Steven K.
1

Saat menggunakan model EF, saya memiliki string koneksi di setiap proyek yang menggunakan model EF. Misalnya, saya memiliki model EF EDMX di perpustakaan kelas yang terpisah. Saya memiliki satu string koneksi dalam proyek web (MVC) saya sehingga dapat mengakses EF db.

Saya juga memiliki proyek pengujian unit lain untuk menguji repositori. Agar repositori dapat mengakses EF db, file app.config proyek pengujian memiliki string koneksi yang sama.

Koneksi DB harus dikonfigurasi, bukan kode, IMO.

danludwig
sumber
2
Saya harus melewatkan string koneksi dengan kode secara manual. Saya menggunakan injeksi ketergantungan.
Shawn Mclean
1

dari sini

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

catatan yang mungkin perlu Anda tambahkan Microsoft.EntityFrameworkCore.SqlServer

Abdullah Tahan
sumber
0

Tidak dapat melihat ada yang salah dengan kode Anda, saya menggunakan SqlExpress dan berfungsi dengan baik ketika saya menggunakan string koneksi di konstruktor.

Anda telah membuat folder App_Data di proyek Anda, bukan?

Lee Smith
sumber
0

Bagi siapa saja yang datang ke sini mencoba mencari tahu cara mengatur string koneksi secara dinamis, dan mendapat masalah dengan solusi di atas (seperti "Format string inisialisasi tidak sesuai dengan spesifikasi mulai dari indeks 0.") saat menyiapkan string koneksi di konstruktor. Inilah cara memperbaikinya:

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)
{
}
Thiago Araujo
sumber