Ich versuche, eine Datenbank mit dem Code First-Ansatz zu erstellen. Wenn ich den folgenden Code ausführen, erhalte ich die folgende Ausnahme. Ist in den von mir definierten Bereichen etwas falsch? Wie können wir das überwinden?
Ausnahme:
Beim Aktualisieren der Einträge ist ein Fehler aufgetreten. Einzelheiten finden Sie in der inneren Ausnahme.
Innere Ausnahme:
"Ungültiger Objektname 'dbo.Dinners'.
Note: Ich habe keine solche Tabelle (Dinners) in der Datenbank. Der Code soll die Tabellen erstellen. Ich habe gerade eine Verbindungszeichenfolge angegeben, um den Server zu identifizieren, wie in EF Code First erwähnt: Verbindung zu SQL Server kann nicht hergestellt werden . Soll ich die Verbindungszeichenfolge ändern?
Connections String:
string connectionstring = "Datenquelle = .; Anfangskatalog = LibraryReservationSystem; Integrated Security = True; Connect Timeout = 30";
Die LibraryReservationSystem-Datenbank ist bereits vorhanden. Es hat keine Tische. Ich erwarte, dass EF die Tabellen erstellt.
Die Verbindungszeichenfolge, die ich von einer funktionierenden LINQ 2-SQL-Anwendung kopiert habe. Muss ich Änderungen daran vornehmen, um sie an EF zu liefern?
UPDATE
Wenn ich den folgenden Code einfügte, wurde die Ausnahme geändert. Jetzt heißt es - "Ungültiger Objektname 'dbo.Dinner'.". Es beschwert sich jetzt über Dinner Table; nicht Abendessenstisch.
protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Ursprünglicher CODE
static void Main(string[] args)
{
string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";
using (var db = new NerdDinners(connectionstring))
{
var product = new Dinner { DinnerID = 1, Title = 101 };
db.Dinners.Add(product);
int recordsAffected = db.SaveChanges();
}
}
using System.Data.Entity;
namespace LijosEF
{
public class Dinner
{
public int DinnerID { get; set; }
public int Title { get; set; }
}
public class RSVP
{
public int RSVPID { get; set; }
public int DinnerID { get; set; }
public virtual Dinner Dinner { get; set; }
}
//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{
public NerdDinners(string connString): base(connString)
{
}
public DbSet<Dinner> Dinners { get; set; }
public DbSet<RSVP> RSVPs { get; set; }
}
}
REFERENZ
Die LibraryReservationSystem-Datenbank ist bereits vorhanden. Es hat keine tische. Ich erwarte, dass EF die Tabellen erstellt.
Das stimmt nicht Wenn die Datenbank existiert, erstellt EF keine Tabellen in dieser Datenbank. EF kann die Datenbank erstellen, wenn sie nicht vorhanden ist. Dies ist der Standard-Datenbankinitialisierer CreateDatabaseIfNotExists
, der angewendet wird, wenn Sie ihn nicht explizit ändern. Sie können zwei andere Initialisierer auswählen: DropCreateDatabaseAlways
oder DropCreateDatabaseIfModelChanges
. Keine davon erstellt jedoch nur Tabellen in einer vorhandenen Datenbank, sondern löscht die Datenbank vollständig und erstellt sie komplett neu, einschließlich aller Tabellen.
Was kannst du tun:
DropCreateDatabaseAlways
-Initialisierer once , damit EF die Datenbank einschließlich der Tabellen erstellen kann, und entfernen Sie den Initialisierer erneutSeed
-Methode, die die Tabellen zur Datenbank hinzufügt@Slaumas Antwort ist die richtige - die Tabellen werden bei der Initialisierung erstellt. Es ist wahrscheinlich am einfachsten, die Datenbank einfach zu löschen und von EF erstellen zu lassen (wenn Sie Ihre Verbindungszeichenfolge unverändert lassen, wird auf dem lokalen Computer eine Datenbank mit dem Namen LibraryReservationSystem erstellt. Sie sollten wahrscheinlich einen expliziten Hostnamen angeben, wenn Sie verwenden möchten die Verbindungszeichenfolge in der Konfig an dieser Stelle).
Sie brauchen etwas in der Art von:
public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> { }
Außerdem müssten Sie den Initialisierer in Ihrer Main-Methode einstellen:
Database.SetInitializer(new NerdDinnersInitializer());
Ein Wort zum Guten: Stellen Sie NIEMALS eine Anwendung mit einem Initialisierer wie dem obigen bereit. In diesem Blogbeitrag erfahren Sie, wie Sie die Initialisierer über die Konfigurationsdatei steuern, um weitere Informationen zu erhalten, wie Sie dies in Produktionsanwendungen steuern können.
Ich bin gerade auf dasselbe Problem gestoßen - ich hatte meine Datenbank bereits auf einer Entwicklungs-SQL-Box in unserem Netzwerk erstellt, die SQL-Authentifizierung erfordert.
Beim Ausführen meiner App wurden keine Tabellen erstellt. Ich fand diesen großartigen, aber einfachen Artikel über das Erstellen einer Code First Database Initializer-Strategie , die zuerst prüft, ob die Datenbank vorhanden ist, und dann ein Skript gegen die Datenbank ausführt, um die Tabellen zu erstellen.
Wie im Artikel - angegeben, beachten Sie, dass bei einer Implementierung einer solchen Strategie bei jedem Neustart der Anwendung alle Datenbanktabellen neu erstellt werden! Diese Strategie sollte nur einmal ausgeführt werden.
Aber das wussten Sie schon.
Nachdem Sie Ihre Entitäten erstellt haben, können Sie mit der rechten Maustaste auf den Arbeitsbereich der EDMX-Datei klicken und "Datenbank aus Modell erstellen ..." auswählen. Klicken Sie durch, bis Sie ein Skript in Ihrem Fenster haben. Für dieses Skript müssen Sie den DB-Erstellungsschritt entfernen (falls vorhanden) und direkt mit CREATE TABLE fortfahren.
Kopieren und einfügen und in jeder beliebigen DB ausführen. Möglicherweise müssen Sie das Skript für ein bestimmtes RDBMS anpassen.
Wie ich verstanden habe, erwarten Sie, dass der Code die Datenbank basierend auf der Beschreibung Ihrer Entität automatisch erstellt. Dies geschieht jedoch nur, wenn Sie den DB explizit erstellen. Bitte überprüfen Sie den folgenden Link http://www.simple-talk.com/dotnet/.net-framework/entity-framework-4460---learn-to-create-databases-from -the-model/ und dieses Tutorial zu EF codefirst: http://codefirst.codeplex.com/
Wie der Fehler vermuten lässt, gibt es in Ihrer Datenbank keine Tabelle mit dem Namen Dinners
.
Verwenden Sie Single- oder Plural-Tabellennamen? also Abendessen oder Abendessen?