Przekaż ciąg połączenia do kodu-pierwszy DbContext

Jak przekazać łańcuch połączenia do kodu entity framework-pierwszy DbContext? Moje generowanie bazy danych działa poprawnie, gdy zarówno DbContext, jak i łańcuch połączeń w sieci web.config jest w tym samym projekcie i nazwany w ten sam sposób. Ale teraz muszę przenieść DbContext do innego projektu, więc testuję przekazując ciąg połączenia do niego w następujący sposób:

Model & Kontekst

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

Akcja

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

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

Www.Config

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

If I set a breakpoint w akcji an analyze the db, The connection string is there, but it doesn ' t create or find the database or anything.

Podczas nawiązywania połączenia z serwerem SQL wystąpił błąd związany z siecią lub specyficzny dla instancji. Serwer nie został znaleziony lub nie był dostępny. Sprawdź, czy nazwa wystąpienia jest poprawna i czy SQL Server jest skonfigurowany tak, aby zezwalał na połączenia zdalne. (dostawca: Named Pipes Provider, error: 40 - Could not open a connection to SQL Serwer)

Author: abatishchev, 2011-01-26

9 answers

Trochę za późno na grę, ale inną opcją jest:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
 71
Author: Bitfiddler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-14 20:15:59

Po przeczytaniu docs, muszę zamiast tego podać nazwę Łańcucha połączenia:

var db = new NerdDinners("NerdDinnerDb");
 55
Author: Shawn Mclean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-26 16:19:37

Pomyślałem, że dodam ten bit dla osób, które szukają "jak przekazać łańcuch połączenia do DbContext": możesz skonstruować łańcuch połączenia dla bazowego magazynu danych i przekazać cały łańcuch połączenia do konstruktora Twojego typu pochodzącego z DbContext.

(ponowne użycie kodu z @LOL Coder) Model & Kontekst

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

Następnie, powiedzmy, że konstruujesz Łańcuch połączeń Sql używając SqlConnectioStringBuilder w następujący sposób:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Gdzie Metoda GetConnectionString konstruuje odpowiedni łańcuch połączeń i SqlConnectionStringBuilder zapewnia, że łańcuch połączeń jest poprawny składniowo; możesz następnie utworzyć instancję konetxt db w następujący sposób:

var myContext = new NerdDinners(builder.ToString());
 36
Author: dotnetguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-03 09:29:50

W DbContext Utwórz domyślny konstruktor dla DbContext i Dziedzicz bazę w następujący sposób:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
 24
Author: Kinh Pham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-09 04:50:32

Jeśli konstruujesz łańcuch połączeń w aplikacji, użyjesz komendy connString. Jeśli używasz ciągu połączenia w konfiguracji sieci Web. Następnie używasz" nazwa " tego łańcucha.

 2
Author: MKunstman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-10 16:53:35

Sprawdź składnię łańcucha połączeń w sieci.config. Powinno być coś w stylu ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

 1
Author: kmerkle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-26 13:38:19

Podczas korzystania z modelu EF, mam ciąg połączeń w każdym projekcie, który zużywa model EF. Na przykład, mam model EF EDMX w oddzielnej bibliotece klas. Mam jeden łańcuch połączeń w moim projekcie Web (mvc), aby mógł uzyskać dostęp do EF db.

Mam też inny projekt testów jednostkowych do testowania repozytoriów. Aby repozytoria mogły uzyskać dostęp do EF db, aplikacja projektu testowego.plik konfiguracyjny ma ten sam łańcuch połączeń.

Połączenia DB powinny być skonfigurowany, nie zakodowany, IMO.

 1
Author: danludwig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-26 13:38:35

Nie widzę nic złego w Twoim kodzie, używam SqlExpress i działa dobrze, gdy używam łańcucha połączeń w konstruktorze.

Stworzyłeś folder App_Data w swoim projekcie, prawda?

 0
Author: Dubious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-26 14:35:57

Mam mały przykład rozwiązania tego problemu.

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);
 0
Author: Durgesh Pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 16:08:33