wake-up-neo.com

Automatisches Erstellen von Datenbanktabellen aus Objekten, Entity Framework

Ich versuche, dieses Tutorial zu machen http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs , aber anstatt zu verwenden In der kompakten Edition von SQL Server verwende ich eine vollständige Installation auf meinem lokalen Computer. Wie ich dieses Tutorial lese, ist, dass das Entity Framework die Tabellen aus den von mir definierten Objekten erstellt. Mein Problem ist, dass ich beim Ausführen des Projekts immer den ungültigen Objektnamen dbo.movies erhalte. Ich habe es endlich zum Laufen gebracht, indem ich die Tabelle selbst erstellt habe, also kenne ich die Verbindungszeichenfolge und alles war korrekt.

Meine Frage ist, ob es möglich ist, Tabellen aus in C # erstellten Objekten zu generieren und wenn ja, wie?

12
Pieces

ist es möglich, Tabellen aus in C # erstellten Objekten zu generieren?

Ja, es ist möglich. Haben Sie die Datenbank manuell in Management Studio erstellt, bevor Sie den Code ausführen? Das könnte dein Problem sein. Bei Code First wird standardmäßig die Datenbank erstellt, wenn sie noch nicht vorhanden ist. Wenn die Datenbank bereits vorhanden ist (auch ohne die Tabellen), wird sie nur die vorhandene Datenbank verwenden (versucht jedoch nicht, die Tabellen zu erstellen).

Sie können entweder die Datenbank löschen und versuchen, den Code erneut auszuführen, um zu sehen, ob sie für Sie erstellt wird, oder die folgende Zeile in Global.asax einfügen:

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>());

Sobald es gelaufen ist, würde ich vorschlagen, diese Zeile zu ändern:

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

Diese Namespaces sind in System.Data.Entity definiert.

Die DbContext-Klasse macht auch eine Database-Eigenschaft verfügbar, die die folgenden nützlichen Methoden definiert:

Delete()
Create()
CreateIfNotExists()

Wenn Sie also Ihre Klasse so definieren:

public class MyContext : DbContext {}

Sie können eine Instanz wie folgt erstellen:

MyContext db = new MyContext();
db.Database.Delete();
db.Database.Create();
22
Dismissile
ModelContext.Database.EnsureCreated();
1
Ronnie

Ich weiß nicht, ob dies koscher ist, aber bei Verwendung von Code-First EF werden bei der Verwendung von AddRange normalerweise alle Tabellen erstellt, die ich definiert habe. Ich wollte die Datenbank behalten, da es zwischen den Anwendungsläufen andere Tabellen gibt, die ich behalten wollte. Ich entdeckte, dass die Tabellen nach dem Löschen nicht erneut erstellt wurden, wenn ich die mit EF erstellte Tabelle mit dem Namen __MigrationHistory nicht gelöscht habe.

Sobald ich diese Tabelle gelöscht habe, erstellt EF die Tabellen neu, ohne die Datenbank neu erstellen zu müssen.

Dies ist vielleicht kein ratsamer Ansatz in der Produktion, aber für meine Entwicklungsbedürfnisse wurde mein Problem gelöst. Vielleicht hilft es jemand anderem.

0
John

Wenn Sie einen Linq-to-Sql-DataContext erstellen, können Sie die Struktur direkt in Ihre Datenbank einfügen:

DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();
0
kyjan

Sie können FenixRepo library (auch als nuget package verfügbar) verwenden, um eine bestimmte Tabelle zu erstellen, die ein Teil von Ihnen ist, Context. Zunächst einmal sollten Sie beim Start die staticInitialize-Methode einmal aufrufen, wobei das erste Argument eine Factory-Methode ist, die die Instanz Ihrer Context zurückgibt, und das zweite eine Instanz von Configurationclass ist. Es werden SQL-Skripts für alle Ihre Tabellen erstellt, die in Ihrer Context registriert sind. Bei ASP.NET MVC ist es eine gute Entscheidung, diesen Code in Global.asax einzufügen:

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration());

Dann können Sie eine Tabelle des gewünschten Typs MyTable auf einfache Weise erstellen:

var repo = new FenixRepositoryCreateTable<MyTable>();
//or repo = new FenixRepository<MyTable>();

repo.CreateTable();

Wenn Ihre Tabelle zwischen mehreren Migrationen verteilt ist und nichts anderes mit anderen Tabellen übereinstimmt, können Sie diese Migrationen (dh Namen von Klassen aus dem Migrationsordner) über FenixAttribute angeben, und genau diese werden als Quelle für SQL-Skripts verwendet für die Tabellenerstellung verwendet werden:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))]
public class MyTable
{
    //some stuff
}

Ohne dieses Attribut verwendet die Bibliothek die Skripts " default ". Es ist immer besser, Migrationen anzugeben, da andernfalls nicht garantiert werden kann, dass alle Indizes erstellt werden. In Ihre Migrationen können Sie auch benutzerdefinierten Code einfügen, der bei default solution nicht ausgeführt wird.

Die Bibliothek ist im Fall von MS SQL mit EF 6.1.3 kompatibel und getestet.

0
Slava Utesinov