Jak jawnie nazwać bazę danych podczas migracji Entity Framework 4.3

Ostatnio zacząłem używać migracji encji i zauważyłem, że nazwa bazy danych nie jest dla mnie odpowiednia, gdy uruchamiam polecenie Update-Database.

Mój connectionstring to:

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

Po raz pierwszy uruchamiam Update-Database moja baza danych jest tworzona z poprawną nazwą TestDB . Jednak gdy tylko dokonam zmiany w jednym z moich podmiotów, nie będzie ona już dla mnie aktualizowana, chyba że dodam nazwę projektu startowego (używam wielu projektów rozwiązanie): {]}

Update-Database -StartUpProjectName "TestDB.Data"

To sprawia, że kolejna nowa baza danych, której migracje zawsze będą używać. Nie mam nic przeciwko komendzie StartUpProjectName , ale czy istnieje sposób na nadpisanie domyślnej nazwy tworzonej bazy danych? Zawsze tworzy bazę danych jako

TestDB.Data.DataContext

Czy istnieje sposób, aby zapewnić, że baza danych utworzona podczas przekazywania nazwy StartUpProject zostanie po prostu wywołana TestDB czy jest to ograniczenie stosowania nazwy Startupproject ustawienie?

Jako Uwaga, myślę, że powodem, dla którego muszę podać nazwę Startupproject jest to, że mam wielowarstwową konfigurację projektu. Plik konfiguracyjny migracji znajduje się w moim projekcie "dane", podmioty/modele w moim projekcie "domena" itp. Nie mam również obecnie żadnych opcji inicjalizacji w moim globalnym.asax.plik cs tak jak bym wcześniej używał kodu first ef 4.2. Tak więc w moim projekcie mam tylko DataContext w moim projekcie danych i konfigurację migracji w tym projekcie również.

EDIT:

Ponieważ początkowo ustawiłem to pytanie, natknąłem się na "poprawny" sposób nazwania bazy danych w rozwiązaniu wieloprojekt. Podczas gdy odpowiedź poniżej będzie działać, oznacza to, że powielasz swoją sieć.config w innym obszarze, który nie jest idealnym rozwiązaniem. Zamiast tego możesz po prostu umieścić nazwę w DbContext, robiąc coś takiego (DataContext to tylko nazwa, której użyłem w moim projekcie):

public class DataContext : DbContext
{
    public DataContext() : base("DatabaseNameHere")
    { }

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }
}

Dzięki,

Rich

Author: Richard Reddy, 2012-02-17

4 answers

Podczas wykonywania update-database należy określić projekt, który zawiera migracje. Upewnij się, że w tym projekcie znajduje się plik app.config, który zawiera prawidłowy ciąg połączenia.

Podczas dzielenia aplikacji na kilka projektów, łańcuch połączeń używany podczas uruchamiania aplikacji jest łańcuchem uruchomionego projektu. Podczas migracji używany łańcuch połączeń jest jednym z projektów zawierających migracje.

Kiedy zrobiłem podobną konfigurację musiałem dodać połączenie ciąg w dwóch miejscach. Trochę niezręcznie, ale działa.

 28
Author: Anders Abel,
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-02-25 13:10:42

Można uniknąć zarządzania nim w aplikacji.config oferując go jako parametr:

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT
Łatwe-piezy, jeśli lubisz pisać bez końca.
 66
Author: Scott Stafford,
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-05-23 17:06:43

Możesz mieć łańcuch połączeń przechowywany w sieci.config w projekcie witryny i DBContext i pliki migracji w innym projekcie i nadal mają ten sam ciąg połączenia. Musisz jednak upewnić się, że oprócz ustawienia projektu danych (lub jakiegokolwiek projektu ma DBContext itp. jako domyślny projekt dla konsoli Menedżera pakietów, musisz również upewnić się, że Twoja witryna jest ustawiona na Domyślny projekt startowy!!!

Nie widzę tego udokumentowane wszędzie, ale szalone 24 godziny nie będąc w stanie dowiedzieć się, dlaczego moje migracje, gdzie nagle został zastosowany do SQLEXPRESS db, doprowadziły mnie do tego wniosku.

 21
Author: Mike Dymond,
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-12-10 15:39:39

[9]}próbowałem z najnowszym EF5 od Nuget.

Jednakże Update-Database nie odczytuje App.config z projektu, który zawiera migracje (tak jak odpowiedź sprzed 1 roku), ale odczyta tylko *.config z start up project. Jest świetny, ale odkrywam, jak Add-Migration i Update-Database znaleźć odpowiedni ciąg połączenia tutaj:

  1. najpierw próbuje uzyskać łańcuch połączeń "DefaultConnection"
  2. następnie próbuje uzyskać nazwę Łańcucha połączenia na podstawie nazwy klasy kontekstowej. Np. mam klasę MyContext pochodzącą z DbContext, więc mogę użyć nazwy łańcucha połączeń "MyContext". Przydatne, gdy mam wiele połączeń db.
  3. Jeśli obie powyższe nazwy łańcuchów połączeń nie zostaną znalezione, to nie będzie wyświetlany i nie będzie wyświetlany żaden łańcuch połączeń "DefaultConnection", chyba że podasz parametr -ConnectionStringName. Zobacz get-help Update-Database, aby wyświetlić stronę pomocy w konsoli Menedżera pakietów.

Nie ma próby ponownego lub awaryjnego połączenia, więc jeśli "DefaultConnection" zawiera błędne połączenie string, po prostu pokaże błąd.

Jeśli w łańcuchach połączeń istnieją zarówno DefaultConnection, jak i nazwa kontekstu, DefaultConnection będzie miało pierwszeństwo.

Wolałbym, aby #2 został pierwszą próbą, ponieważ nazwa jest bardziej szczegółowa, ale powyższe kroki są tym, co robią migracje EF5 podczas próby połączenia z db.

 9
Author: CallMeLaNN,
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
2016-02-26 10:39:15