Bağlantı dizesini kod ilk DbContext'e geçirin


92

Varlık çerçevesinin kod ilk DbContext'ine bir bağlantı dizesini nasıl iletirim? Veritabanı neslim, hem DbContext hem de web.config'deki bağlantı dizesi aynı projede olduğunda ve aynı şekilde adlandırıldığında düzgün çalışıyor. Ama şimdi DbContext'i başka bir projeye taşımam gerekiyor, bu yüzden ona aşağıdaki gibi bir bağlantı dizesi geçirmeyi test ediyorum:

Model ve Bağlam

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

Aksiyon

    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>

Eylemde bir kesme noktası belirler ve analiz edersem db, bağlantı dizesi oradadır, ancak veritabanını veya herhangi bir şeyi oluşturmaz veya bulmaz.

SQL Server'a bağlantı kurulurken ağla ilgili veya örneğe özgü bir hata oluştu. Sunucu bulunamadı veya erişilebilir değildi. Örnek adının doğru olduğunu ve SQL Server'ın uzak bağlantılara izin verecek şekilde yapılandırıldığını doğrulayın. (sağlayıcı: Named Pipes Provider, hata: 40 - SQL Server'a bağlantı açılamadı)


Doğru sunucuya bağlandığınızdan kesinlikle emin misiniz? Hata, tipik bir SQL Server / Express istisnasıdır. Yol ... belki bulunamaz sürece ... yoksa senin gibi bir SQL CE veritabanına olduğunuz bağlantı gelmedi ... ve EF Kod ilk veritabanını yaratacak
Steven K.

Temel olarak, OP'nin hatası tüm bağlantı dizisini sadece isim yerine DbContaxt kurucusuna göndermekti. Belgelerin dediği gibi: "DbContext (String) Verilen dizeyi veri tabanı için ad veya bağlantı dizesi olarak kullanarak yeni bir bağlam örneği oluşturur"
Göran Roseen

Yanıtlar:


86

Burada oyuna biraz geç, ancak başka bir seçenek de:

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

2
Selam! Beni bir yere götüren tek çözüm buydu. Benim sorunum, ayarları web.config yerine Azure yapılandırma dosyamdan almak istemem. Yine de, bu yöntem 'Sağlayıcı' ayarı eksik olduğundan çalışmaz (web.config dosyasında bir öznitelik olarak ayarlanmıştır). Herhangi bir fikir?
kullanıcı

1
Mükemmel cevap! Yapılan tek değişiklik, connString parametresini kaldırmak ve ardından uygulama ayarlarında kaydedilen bağlantı dizesini kullanmaktı .... this.Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString
yararlıBee

Hem connString hem de DbCompiledModel nesnesini aynı anda parametre olarak nasıl geçirebilirim?
Behzad Ebrahimi

Güzel. Sadece "bu" gereksizdir, onu kaldırabilirsiniz.
tocqueville

1
sınıf modülünüz Manual changes to this file will be overwritten if the code is regenerated.başlıkta içeriyorsa , bunu Kısmi Sınıflar ve Yöntemler (C # Programlama Kılavuzu)
woodvi

59

Belgeleri okuduktan sonra, bunun yerine bağlantı dizesinin adını iletmem gerekiyor:

var db = new NerdDinners("NerdDinnerDb");

Bunu kurucuma koydum ve başka bir yerde referans olması için gerekli olması durumunda onu genel bir sabit yaptım.
Tony Wall

37

Bu biti "Bir DbContext'e bir bağlantı dizesi nasıl iletilir" aramaya gelenler için ekleyeceğimi düşündüm: Temel veri deponuz için bir bağlantı dizesi oluşturabilir ve tüm bağlantı dizesini DbContext'ten türetilen türünüzün yapıcısına iletebilirsiniz. .

(@Lol Coder'dan Kodu Yeniden Kullanma) Model ve Bağlam

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

Ardından, SqlConnectioStringBuilder kullanarak bir Sql Bağlantı dizesi oluşturduğunuzu söyleyin:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

GetConnectionString yönteminin uygun bağlantı dizesini oluşturduğu ve SqlConnectionStringBuilder bağlantı dizesinin sözdizimsel olarak doğru olmasını sağladığında; daha sonra db bağlamınızı şu şekilde başlatabilirsiniz:

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

4
Gerçekten zor koduna bağlantı dizesi yaptım:public TestAppContext() : base("Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True") { }
İlyas W. Gagne

28

DbContext'inizde, DbContext'iniz için varsayılan bir kurucu oluşturun ve tabanı şu şekilde devralın:

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

1
Benim durumumda, MyConnectionString... adlı bir DB oluşturur (evet bağlantı dizesi mevcuttur). Koymak zorundayım name=MyConnectionString.
Matthieu Charbonnier

2

Uygulama içinde bağlantı dizesini oluşturuyorsanız, o zaman connString komutunuzu kullanırsınız. Web yapılandırmasında bir bağlantı dizesi kullanıyorsanız. Sonra bu dizenin "adını" kullanırsınız.


2

Bu sorun için küçük bir çözüm örneğim var.

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

Sınıfım.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 dosyasında bağlantı dizenizin sözdizimini kontrol edin. Gibi bir şey olmalıConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"


Bağlantı dizesi, ikisi de aynı projede aynı adı kullandığında çalışır.
Shawn Mclean

Manuel olarak DbConext'e geçirmek istediğimde çalışmıyor
Shawn Mclean

Bağlantı dizesi gayet iyi, yolun mutlak olmasına gerek yok.
Steven K.

1

Bir EF modeli kullanırken, EF modelini tüketen her projede bir bağlantı dizesi var. Örneğin, ayrı bir sınıf kitaplığında bir EF EDMX modelim var. EF db'ye erişebilmek için web (mvc) projemde bir bağlantı dizem var.

Ayrıca depoları test etmek için başka bir birim test projem var. Depoların EF veritabanına erişmesi için, test projesinin app.config dosyası aynı bağlantı dizesine sahiptir.

DB bağlantıları, IMO olarak kodlanmamalı, yapılandırılmalıdır.


2
Bağlantı dizesini kod ile manuel olarak iletmem gerekiyor. Bağımlılık enjeksiyonu kullanıyorum.
Shawn Mclean

1

dan burada

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

eklemeniz gerekebilir not Microsoft.EntityFrameworkCore.SqlServer


0

Kodunuzda yanlış bir şey göremiyorum, SqlExpress kullanıyorum ve yapıcıda bir bağlantı dizesi kullandığımda iyi çalışıyor.

Projenizde bir App_Data klasörü oluşturdunuz, değil mi?


0

Buraya gelen ve bağlantı dizesini dinamik olarak nasıl ayarlayacağını bulmaya çalışan ve yukarıdaki çözümlerle ilgili sorun yaşayan herkes için ("Başlatma dizesinin formatı, dizin 0'dan başlayan belirtime uymuyor" gibi). yapıcı. Nasıl düzeltilir?

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)
{
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.