Laden...

EF4.1 - Code First: Datenbankinhalte übernehmen?

Erstellt von Sclot vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.267 Views
S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 12 Jahren
EF4.1 - Code First: Datenbankinhalte übernehmen?

verwendetes Datenbanksystem: SQL Server 2008 R2

Hallo,

ich habe mich heute etwas mit dem Code First vom EF4.1 beschäftigt.
Ich habe nun auch eine kleine WinForms Anwendung, in welcher ich objekte erstellen und über das DBContext Objekt in der Datenbank persitieren kann.
Alles super!

Wenn die Datenbank noch nicht existiert, wird sie Angelegt und die Tabellen Struktur erzeugt.
Bei Strukturänderungen, welche aus einer Änderung der Objekte hervorgeht, kann mit:


Database.SetInitializer<ProductContext>(new DropCreateDatabaseIfModelChanges<ProductContext>());

Die Datenbank beim Aufruf der Anwendung durch das EF neu angelegt werden, so das die Objekt-Änderungen als Struktur-Änderungen innerhalbt der Datenbank mit gezogen werden.
Ebenfalls alles irgendwie Super!

Aber...
Ist das sinning, dass die komplette Datenbank gelöscht wird und neu angelegt wird?
Ok, wenn ich manuell ein ALTER TABLE mache, wird die DB vermutlich intern auch verworfen und neu zusammen gewürfelt.
Aber wenn ich ein ALTER TABLE mache, sind die Daten aus den tabellen nicht gleich alle weg 😕
Also Frage: Ist das von MS so beabsichtigt das die Daten bei Struktur-Anderungen nicht mit übernommen werden - oder hab ich nicht genug gelesen und das geht irgendwie?

Und... wie Praxisnah ist so eine Code-First Vorgehensweise beim Erstellen von Datenhaltigen Anwendungen überhaupt?

Wie haben hier z.B. sehr sehr viele und häufige Strukturänderungen unserer Datenbanken (Eine Individuell nach Kundenwunsch angepasste Anwendung).
Ich habe irgendwo gelesen das DAS Code-First Model nur von Entwicklern zur Entwicklungszeit benutzt werden soll.
Aber wie bekommt man dann seine Strukturänderungen sinnvoll zum kunden übertragen?

Irgendwie stehe ich grad voll aufm dicken schlauch 😕

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Sclot,

Ist das sinning, dass die komplette Datenbank gelöscht wird und neu angelegt wird?

Für diesen einen Initializer schon, da steht auch überall in der Beschreibung wozu der gut ist -> eben nicht für den produktiven Einsatzt und da steht dann weiter dass ein eigener erstellt werden kann. MS kann halt zu Beginn nicht alle Fälle abdecken. Aber siehe EF 4.1 - Code First - SetInitializer (erstellt die DB wenn sie nicht existiert, sonst werden die Tabellen geändert). Kann aber auch auf den eigenen Fall genauer angepasst werden.

wie Praxisnah ist so eine Code-First Vorgehensweise beim Erstellen von Datenhaltigen Anwendungen überhaupt?

Ich finde sehr. V.a. da ich POCOs verwenden kann.

Ich habe irgendwo gelesen das DAS Code-First Model nur von Entwicklern zur Entwicklungszeit benutzt werden soll.

Wo hast du denn das her? Das ist - sorry - Shit.
Wie sollte auch die Anwendung zur Laufzeit laufen wenn das Model nicht mehr verwendet werden kann? 🤔

Aber wie bekommt man dann seine Strukturänderungen sinnvoll zum kunden übertragen?

Durch den Initializer.

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

16.834 Beiträge seit 2008
vor 12 Jahren

Hi,

Ich finde sehr. V.a. da ich POCOs verwenden kann.

Ich persönlich habe keine gute Erfahrung mit der Code First Variante gemacht - und POCOs kann ich auch mit jeder anderen Variation vom Entity Framework nutzen. Zudem finde ich überhaupt nicht, dass es praxisnah ist - ich finde es eher umständlich, da ich bei einem Schema einen direkten Blick auf alle Abhängigkeiten habe und so m.M. unterm Strich produktiver bin.

Meines Wissens nach gibt es auch noch gar kein Tracking von Schema-Changes bei CF. Das soll doch erst mit Version 4.5/5.0 kommen bzw. durch ein Addin.

Strukturänderungen sollten aber - finde ich - gewollt manuell passieren; und nicht automatisiert. Das sollte auch dokumentiert sein!
Aber das müssen wir hier nicht diskutieren - das haben wir in Deinem verlinkten Thread bereits getan 😃