Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
EF 4.1 - Code First - SetInitializer
manullino
myCSharp.de - Member

Avatar #avatar-2873.jpg


Dabei seit:
Beiträge: 373
Herkunft: Oranjestad, Aruba

Themenstarter:

EF 4.1 - Code First - SetInitializer

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von manullino am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15980

beantworten | zitieren | melden

Kurz un knapp: Nein.
Du müsstest Dir eine eigene Migrationsroutine schreiben.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

beantworten | zitieren | melden

Hi...
Zitat
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15980

beantworten | zitieren | melden

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

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10077

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7548
Herkunft: Waidring

beantworten | zitieren | melden

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);
		}
	}
}
Zitat
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!"
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 966

beantworten | zitieren | melden

Zitat von gfoidl
...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 ...
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7548
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers