2016-04-22 5 views
8

Ich habe ein Model-First-Entitätsmodell, das eine Customer-Tabelle enthält, die mit einer Ansicht verknüpft ist, die Kundendetails aus einer separaten Datenbank abruft. Die Beziehung ist eins zu viele zwischen der Customer-Tabelle und der View und ich habe eine Navigationseigenschaft sowohl für die Customer-Entität als auch für die View-Entität.Löschen von Entitätsobjekt mit 1 zu vielen Assoziation zu View-Based Entity

Wenn ich versuche, ein ausführen löschen context.SaveChanges mit context.Customers.DeleteObject (cust) und nennen() Ich erhalte eine Fehlermeldung:

Unable to update the EntitySet 'ViewEntity' because it has a DefiningQuery and no [DeleteFunction] element exists element to support the current operation.


Ich habe versucht, auf Löschen Cascade Einstellung und Keine und beide erzeugen den gleichen Fehler.

EDIT: Es gibt nicht viel Code zu zeigen, aber hier geht:

Customer selectedCust = (Customer)dgvCustomers.SelectedRows[0].DataBoundItem; 
if (selectedCust != null) 
{ 
    if (MessageBox.Show(String.Format("Are you sure you want to delete Customer {0}?", selectedCust.CustomerID.ToString()), 
          "Customer Delete Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes) 
    { 
     // TODO - Fix this 
     this.ReportSchedDBContext.Customers.DeleteObject(selectedCust); 
     this.ReportSchedDBContext.SaveChanges();      
    } 
} 
+1

zeigen Sie uns Ihren Code bro –

+1

Hat Ihre Entität und Tabelle einen Primärschlüssel? – Overmachine

+0

Die Entität, die auf einer realen Tabelle (Kunde) basiert, tut dies nicht, da sie auf einer Ansicht basiert. – Overhed

Antwort

1

ich war in der Lage, um dieses Problem zu umgehen, indem ein Dummy für gespeicherte Prozeduren zu schaffen, die nichts tut ("SELECT 'Done'") und mit der SP Function Mapping in meinen beiden Ansichten die Löschfunktion auf diese Stored Procedure setzen. Ziemlich ein Hack, aber es hat funktioniert.

Ich bin mir nicht sicher, warum eine Delete-Funktion für eine Ansicht erforderlich ist oder ob ich etwas anderes falsch mache, das das Problem verursacht hat, aber das obige funktionierte für mich.

1

Viele verwandten Beiträge in SO mit @Overmachine einverstanden ... Sie wahrscheinlich einen Primärschlüssel auf Ihrer Einheit/Tabelle fehlt.

See ..

because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element

und

Unable to update the EntitySet - because it has a DefiningQuery and no <UpdateFunction> element exist


EDIT

einfach Ihren Kommentar sah in Bezug auf Ihre 012.Tabelle mit einem Primärschlüssel, aber Ihre Ansicht nicht. Nicht sicher, was passiert, ohne mehr von Ihrem Code, aber letztlich alles, was Sie brauchen, ist ein Customer Objekt mit dem Primärschlüssel (s) gesetzt, dann können Sie den folgenden Code verwenden, um ein losgelöstes Objekt zu löschen.

this.ReportSchedDBContext.Entry(selectedCust).State = EntityState.Deleted; 
this.ReportSchedDBContext.SaveChanges(); 

Wenn Sie von einem anderen Typ sind Gießen und dass Probleme verursacht, können Sie auch tun:

var cust = new Customer { CustomerID = selectedCust.CustomerID }; 
this.ReportSchedDBContext.Entry(cust).State = EntityState.Deleted; 
this.ReportSchedDBContext.SaveChanges(); 
+0

Hallo Chris, Danke für deine Hilfe. Ich habe vergessen zu verdeutlichen, dass ich auf einer älteren Version von EF (v4) stehe, also trifft das meiste von dem, was du gepostet hast, nicht auf mich zu (zB DBContext). Ich habe versucht, meine Version zu aktualisieren, aber eine Menge Dinge sind kaputt gegangen und ich habe keine Zeit, dies jetzt anzugehen. – Overhed

0

Ich denke, Sie sollten alle Fremdschlüssel in View verwenden. Wenn Sie alle Fremdschlüssel und Primärschlüssel in der Ansicht verwenden, können Sie das Objekt als Kaskade aktualisieren und löschen.

+0

Vielen Dank für Ihre Antwort, aber ich wollte * nichts löschen in der Ansicht. In der Tat deaktivierte ich Delete Cascade und ich bekam immer noch den gleichen Fehler. Ich musste im Grunde eine Dummy-Löschfunktion mit einer Stored Procedure definieren, die nichts unternimmt und das Löschen mit der View verknüpft, damit die Logik funktioniert. – Overhed

Verwandte Themen