webentwicklung-frage-antwort-db.com.de

Entity Framework-Ausnahme: Ungültiger Objektname

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?

enter image description here

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

  1. http://nerddinner.codeplex.com/discussions/358197
  2. Entity Framework - Ungültiger Objektname
  3. Ungültiger Objektname 'dbo.TableName' beim Abrufen von Daten aus der generierten Tabelle
  4. http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx
26
Lijo

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:

  • Löschen Sie entweder die Datenbank manuell (z. B. in SSMS), dann erstellt EF eine neue Datenbank mit den Tabellen
  • Oder verwenden Sie den DropCreateDatabaseAlways-Initialisierer once , damit EF die Datenbank einschließlich der Tabellen erstellen kann, und entfernen Sie den Initialisierer erneut
  • Oder wenn Sie die Datenbank aus irgendeinem Grund nicht löschen können, schreiben Sie SQL-Code in die Seed-Methode, die die Tabellen zur Datenbank hinzufügt (Falsch, danke Mark Staffords Kommentar)
  • Oder verwenden Sie Code-First Migrations (EF> = 4.3), um einer vorhandenen Datenbank neue Tabellen hinzuzufügen, wenn Sie neue Entitäten hinzugefügt haben.
27
Slauma

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

2
Brett

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.

0
Renats Stozkovs

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/

0
Sasha

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?

0
Gavin