2009-06-04 16 views
4

Ich versuche, diese Woche mit EF in den Griff zu bekommen, und ich gehe soweit in Ordnung, aber ich habe gerade meinen ersten großen Haken getroffen. Ich habe eine Tabelle mit Gegenständen und eine Tabelle mit Kategorien. Jeder Gegenstand kann mit vielen Kategorien "markiert" werden, also habe ich eine Verbindungstabelle erstellt. Zwei Spalten, eine die primäre ID des Elements, die andere die primäre ID der Kategorie. Ich habe einige Daten manuell zur Datenbank hinzugefügt und kann alles über EF in meinem Code abfragen.Hinzufügen und Entfernen von Assoziationen - Entity Framework

Jetzt möchte ich ein neues Element mit einer der vorhandenen Kategorien "markieren". Ich habe die Kategorie ID hinzufügen und die ID des Elements. Ich lade beide als Entitäten mit Linq und dann versuchen Sie Folgendes.

 int categoryToAddId = Convert.ToInt32(ddlCategoriesRemaining.SelectedValue); 
    var categoryToAdd = db.CollectionCategorySet.First(x => x.ID == categoryToAddId); 
    currentCollectionItem.Categories.Add(categoryToAdd); 
    db.SaveChanges(); 

Aber ich bekomme „Kann die EntitySet‚collectionItemCategories‘aktualisieren, da es eine DefiningQuery hat und kein Element existiert in dem Element den aktuellen Vorgang zu unterstützen.“

Habe ich etwas verpasst? Ist das nicht der richtige Weg? Ich versuche das gleiche für das Entfernen und auch kein Glück.

Antwort

1

Ich denke, ich habe es geschafft, diese selbst zu beantworten. Nach vielen Recherchen stellt sich heraus, dass das Entity Framework (wie es in VS2008 SP1 enthalten ist) viele bis viele Beziehungen nicht wirklich gut unterstützt. Das Framework erstellt eine Liste von Objekten aus einem anderen Objekt über die Beziehung, was sehr nett ist, aber wenn es darum geht, die Beziehungen hinzuzufügen und zu entfernen, kann dies nicht sehr einfach durchgeführt werden. Sie müssen dazu Ihre eigenen gespeicherten Prozeduren schreiben und diese dann mit Entity Framework über die Funktion Import-Route registrieren.

Es gibt auch ein weiteres Problem mit dieser Route, da Funktionsimporte, die nichts zurückgeben, wie das Hinzufügen einer Viele-zu-Viele-Beziehung, nicht zum Objektkontext hinzugefügt werden. Wenn Sie Ihren Code schreiben, können Sie sie nicht einfach so verwenden, wie Sie es erwarten würden.

Für jetzt werde ich einfach bei der Durchführung dieser Verfahren auf altmodische Weise mit executenonquery() bleiben. Scheinbar bessere Unterstützung dafür soll in VS2010 eintreffen.

Wenn jemand das Gefühl hat, dass ich meine Fakten falsch verstanden habe, können Sie mir bitte Recht geben.

+0

Obwohl es stimmt, dass viele zu viele in EF unnötigerweise kompliziert sind und Einschränkungen im Vergleich zu anderen ORMs haben, unterstützt es viele bis viele Beziehungen ziemlich gut, solange Sie FKs in Ihrer Linktabelle und keine Passagierspalten haben, dh Sie haben nur FK-Spalten in Ihrer Linktabelle. Der Fehler, den Sie erhalten, weist darauf hin, dass Ihre Tabellenbeziehungen nicht korrekt zugeordnet sind, da die EF keine Einfügeabfrage generieren kann und erwartet, dass Sie eine mit der Definitionsabfrage definieren. – burnside

0

Nachdem Sie Ihr Item-Objekt erstellt haben, müssen Sie das Item-Objekt auf das Category-Objekt in der Categories-Eigenschaft des Elements festlegen. Wenn Sie ein neues Item-Objekt hinzufügen, etwas zu tun, wie folgt aus:

Using (YourContext ctx = new YourContext()) 
{ 
    //Create new Item object 
    Item oItem = new Item(); 
    //Generate new Guid for Item object (sample) 
    oItem.ID = new Guid(); 
    //Assign a new Title for Item object (sample) 
    oItem.Title = "Some Title"; 
    //Get the CategoryID to apply to the new Item from a DropDownList 
    int categoryToAddId = Convert.ToInt32(ddlCategoriesRemaining.SelectedValue); 
    //Instantiate a Category object where Category equals categoryToAddId 
    var oCategory = db.CategorySet.First(x => x.ID == categoryToAddId); 
    //Set Item object's Categories property to the Category object 
    oItem.Categories = oCategory; 
    //Add new Item object to db context for saving 
    ctx.AddtoItemSet(oItem); 
    //Save to Database 
    ctx.SaveChanges(); 
} 
+0

Vielen Dank für Ihre Hilfe, aber ich bin mir ziemlich sicher, nur daran zu sehen, dass es nicht funktionieren wird. Sie versuchen, die Elementkategorien (eine Liste von Kategorienobjekten) auf eine Kategorie (ein einzelnes Kategorieobjekt) festzulegen. Offensichtlich wird diese Art von Mismatch nicht funktionieren. Kurz gesagt, meine Frage ist, wie Sie Referenztabellen-Daten hinzufügen und entfernen, wobei die Kategorien meine Referenztabelle sind. –

+0

Ich setze oCategory zum ersten Datensatz von der Kategorie basierend auf der CategoryID. Sie können dann das Attribut Kategorien auf das einzelne Category-Objekt festlegen. Ich glaube, dass Sie diese Codezeile auch damit ersetzen könnten: oItem.Categories.CategoryID = oCategory.CategoryID; –

0

Haben Sie Fremdschlüssel auf beiden Spalten in der Link-Tabelle auf das Element und die Kategorie setzen oder die Beziehung definiert als viele zu viele in der Mapping Einzelheiten?