Laden...

EF 4.1 - Code First - SetInitializer

Erstellt von manullino vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.230 Views
manullino Themenstarter:in
371 Beiträge seit 2008
vor 12 Jahren
EF 4.1 - Code First - SetInitializer

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

16.806 Beiträge seit 2008
vor 12 Jahren

Kurz un knapp: Nein.
Du müsstest Dir eine eigene Migrationsroutine schreiben.

M
402 Beiträge seit 2005
vor 12 Jahren

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

16.806 Beiträge seit 2008
vor 12 Jahren

Das soll aber erst in EF5 integriert werden - also gibt's aktuell keine automatische Möglichkeit.

F
10.010 Beiträge seit 2004
vor 12 Jahren

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.

6.911 Beiträge seit 2009
vor 12 Jahren

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!"

W
955 Beiträge seit 2010
vor 12 Jahren

...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 ...

6.911 Beiträge seit 2009
vor 12 Jahren

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!"