verwendetes Datenbanksystem: <EF 4.1>
Hallo zusammen,
seit einigen Tagen arbeite ich mit dem EF 4.1 Code First.
Wie Ihr sicher wisst, kann man mit,
Database.SetInitializer<MyDBContext>
(new DropCreateDatabaseIfModelChanges< MyDBContext >());
die Datenbank neu generieren lassen, wenn sich am Model etwas geaendert hat.
Ganz klarer Nachteil ist natuerlich, dass alle Daten dabei verloren gehn.
Gibt es denn eine Moeglichkeit, die Datenbank ohne Datenverlust updaten?
Vielen Dank,
Manullino
Kurz un knapp: Nein.
Du müsstest Dir eine eigene Migrationsroutine schreiben.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi...
Kurz un knapp: Nein
Naja, so würd ich das nicht sagen...
Die Devs vom EF-Team werkeln da an etwas...
Code First Database Evolution (aka Migrations)
lg
Das soll aber erst in EF5 integriert werden - also gibt's aktuell keine automatische Möglichkeit.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Und im Zuge der besseren Dokumentation finde ich auch einen Automatismus eher schlecht.
Benutze etwas wie Migrator.net oder FluentMigrator, das Dokumentiert gleich die Änderungen und sie sind mit im SCM.
Hallo,
zur automatischen Migration braucht "nur" IDatabaseInitializer<TContext> implementiert werden. ZB für das Erstellen von zusätzlcihen Tabellen zu einer bestehenden Datenbank:
public class CreateTablesOnlyIfTheyDontExistInitializer<TContext>
: IDatabaseInitializer<TContext>
where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Suppress))
{
if (context.Database.CreateIfNotExists()) return;
ObjectContext objectContext = (context as IObjectContextAdapter).ObjectContext;
string script = objectContext.CreateDatabaseScript();
if (!(context.Database.Connection is SqlConnection))
throw new InvalidOperationException(
"This initializer is only compatible with SQL Server.");
string pattern = @"create table \[?(?<schema>\w+)\]?\.\[?(?<tablename>\w+)\]?";
string replacement =
"if not exists (" +
" select * from information_schema.tables " +
" where table_schema = '${schema}' and table_name = '${tablename}'" +
")\n$&";
script = Regex.Replace(script, pattern, replacement, RegexOptions.IgnoreCase);
pattern = @"alter table \[?(?<schema>\w+)\]?\.\[?(?<tablename>\w+)\]?\s+add constraint \[?(?<constraint>\w+)\]?";
replacement =
"if not exists (" +
" select * from information_schema.table_constraints " +
" where table_schema = '${schema}' and table_name = '${tablename}' and constraint_name = '${constraint}'" +
")\n$&";
script = Regex.Replace(script, pattern, replacement, RegexOptions.IgnoreCase);
objectContext.ExecuteStoreCommand(script);
}
}
}
Benutze etwas wie Migrator.net oder FluentMigrator, das Dokumentiert gleich die Änderungen und sie sind mit im SCM.
Das würde ich bei einem "Umbau" der DB auch vorziehen. Als weiteres "Tool" seien die Datenbank-Projekte von Visual Studio genannt bzw. das Schema Compare (ist aber nicht in jeder Edition vorhanden).
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
...Als weiteres "Tool" seien die Datenbank-Projekte von Visual Studio genannt bzw. das Schema Compare ...
Hi,
wieweit kommen eigentlich diese Lösungen mit einer Umbenennung zurecht?
Also im allgemeinem, nicht TSQL-Spezifischem SQL:
ALTER TABLE mytbl RENAME mycol1 TO mycol2
vs
ALTER TABLE mytbl DROP mycol1
ALTER TABLE mytbl ADD mycol2 ...
Hallo witte,
das VS-DB-Projekt gut. Es erstellt eine temp. Tabelle und schreibt die Inhalte der zu umbennenden Tabelle da rein -> löscht diese Tabelle -> bennent die temp. Tabelle um. Das ganze ist auch in der Transaktion. Oder kurz: ich hatte damit noch nie Probleme.
Dieser Thema hier aber bitte nicht weiter diskutieren. Falls doch bitte PN ans Team, dann können wir das abteilen.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"