2016-04-16 11 views
0

Cross posted on MSDNDas Unternehmen Satz wird nicht in der Entitätscontainername definiert

Wir manuellen Code verwenden erster Entity Framework für System.Data.SQLite

Also, wenn eine neue Einheit zu schaffen, wir die Tabelle manuell erstellen, die C# Objekt, und fügen Sie das DbSet zu unserem Kontext hinzu.

Ich habe ein sehr einfaches Objekt erstellt, und ich bekomme diesen Fehler beim Versuch, den Kontext abzufragen. Ich habe die Spaltennamen und Datentypen mehrmals überprüft, aber ich sehe hier keinen Unterschied. Es sind auch keine Fremdschlüsselbeziehungen definiert, obwohl die Felder ID im Namen haben. Nur ein eigenständiger Tisch.

Der seltsamste Teil ist, dass ich eine neue Entität zum Kontext hinzufügen, Änderungen speichern kann, und es wird in der Datenbank beibehalten werden. Allerdings in der nächsten Zeile beim Versuch, die Entitäten abrufen, bekomme ich The entity set is not defined in the entity container Fehler. Ich habe auch bemerkt, dass, wenn ich den Mauszeiger über einen instanziierten Kontext bewege, alle anderen db-Sätze den EF SQL wie SELECT EXTENT1.myCol as myCol haben, aber der department_resources Satz sagt nur {System.Data.Entity.DbSet<department_resource>}.

Irgendwelche Ideen, was das Problem hier ist?

Im Folgenden sind Auszüge meiner Dateien:

DDL

CREATE TABLE department_resources (
dep_res_key VARCHAR PRIMARY KEY, 
department_id INT NOT NULL, 
resource_id INT NOT NULL); 

department_resource.cs

[Table("department_resources")] 
public class department_resource 
{ 
    [Key] 
    public string dep_res_key { get; set; } 
    public int department_id { get; set; } 
    public int resource_id { get; set; } 
} 

MyContext.cs

public class MyContext : DbContext 
{ 
public DbSet<department_resource> department_resources { get; set; } 
} 

Probe Nutzungs

using (MyContext db = new MyContext()) 
{ 
    db.department_resources.Add(new department_resource() 
     { dep_res_key = "anID", 
     resource_id = 22, 
     department_id = 23 }); // Works 

    db.SaveChanges(); // Also works. Even persists to db 

    var foo = from r in db.department_resources 
       select r.resource_id; // Doesn't work. Will error as soon as I try to use foo. Like assigning to a combo box item source. Or even just enumerating the results 

    var bar = db.department_resources; // Also doesn't work. 

} 
+1

Haben Sie die Datenbank eingesehen? Ist dies gespeichert? – Eldho

+0

Ja, es ist in db gespeichert – wesmantooth

+0

Könnten Sie bitte versuchen, indem Sie einen neuen db-Kontext 'using (MyContext db = new MyContext())' und versuchen, in diesem neuen Kontext zu holen – Eldho

Antwort

1

Das Problem ist mit verzögerte Ausführung. Obwohl Sie foo und bar innerhalb Ihres using Blocks zuweisen, werden sie erst ausgewertet, wenn sie tatsächlich verwendet werden, nachdem MyContext entfernt wurde.

Sie müssen erzwingen, dass sie innerhalb Ihres Verwendungsblocks ausgewertet werden. z.B. durch Konvertieren der Ergebnisse in Listen.

Auch ich bemerke, dass Sie sie als vars in Ihrem using Block deklariert haben. Sie müssen definiert werden außerhalb der es in der Lage sein, sie draußen zu verwenden (vielleicht Sie tat dies nur in Ihrer Probe zu vereinfachen?)

List<int> foo; 
List<department_resource> bar; 

using (MyContext db = new MyContext()) 
{ 
    db.department_resources.Add(new department_resource() 
     { dep_res_key = "anID", 
     resource_id = 22, 
     department_id = 23 }); // Works 

    db.SaveChanges(); // Also works. Even persists to db 

    foo = (from r in db.department_resources 
       select r.resource_id).ToList(); 

    bar = db.department_resources.ToList(); 

} 

Von MSDN

die Abfrage Variable selbst nur speichert die Abfrage-Befehle. Die tatsächliche Ausführung der Abfrage wird zurückgestellt, bis Sie über die Abfrage Variable in einer Foreach-Anweisung durchlaufen.Dieses Konzept wird als verzögerte Ausführung

Erzwingen Unmittelbare Ausführung

Abfragen, die Aggregationsfunktionen über einen Bereich von Quellenelementen durchführen müssen diese Elemente zuerst iterieren . Beispiele für solche Abfragen sind Count, Max, Average und First. Diese werden ohne eine explizite foreach-Anweisung ausgeführt, da die -Abfrage selbst foreach verwenden muss, um ein Ergebnis zurückzugeben. Beachten Sie auch , dass diese Abfragetypen einen einzelnen Wert zurückgeben, keine IEnumerable Sammlung.

Sie können die Ausführung auch erzwingen, indem Sie die foreach-Schleife sofort nach dem Abfrageausdruck auf setzen. Durch den Aufruf von ToList oder ToArray speichern Sie jedoch auch alle Daten in einem einzigen Sammlungsobjekt zwischen .

+0

Ich war tatsächlich mit '(von r in db.department_resources wählen r.resource_id) .ToList();' ursprünglich aber entfernt ToList(), um die Ausführung absichtlich verzögern und bei der Fehlersuche helfen. Ich hoffte, eine Select-Anweisung oder etwas Hilfreiches zu sehen, aber keine Select-Anweisung ist verfügbar, wenn man über foo schwebt. Nur '{System.Data.Entity.Infrastructure.DbQuery }'. Das Hinzufügen der 'ToList()' zurück führt zu dem Fehler, der in der gleichen Zeile auftritt wie die Zuweisung zu 'foo' – wesmantooth

+0

Sorry, ich bin dann ratlos. Ich kann nichts anderes in Ihrem Code sehen, das dies verursachen könnte. Ich würde vorschlagen, Ihre Frage so zu aktualisieren, dass sie das Schlüsselwort 'virtual' enthält, ein Beispiel in Ihren Beispielcode hinzufügt, wo Sie die Auswertung erzwingen (z. B. mit' ToList() ') und vielleicht einen Screenshot dessen hinzufügen, was Sie sehen, wenn Sie den Mauszeiger über' db bewegen '. Vielleicht wird jemand anderes ein Problem sehen. Versuchen Sie vielleicht, Ihre Datenbank aus Ihrem Modell neu zu generieren, um zu sehen, ob sie Fehler verursacht (und die erstellten Tabellen etc.) und überprüfen Sie, ob der Code in der Frage genau mit Ihrem übereinstimmt. – Tone