2016-04-22 10 views
8

Ho un modello entità Model-First che contiene una tabella Customer collegata a una vista che recupera i dettagli del cliente da un database separato. La relazione è da uno a molti tra la tabella Cliente e la Vista e ho una proprietà di navigazione sia sull'entità Cliente che sull'entità Visualizza.Eliminazione di oggetto Entity con associazione da 1 a molti a entità View-

Quando si tenta di eseguire un eliminare utilizzando context.Customers.DeleteObject (cust) e chiamare context.SaveChanges() ottengo un errore:

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


Ho provato a fissare On Delete Cascade e Nessuno ed entrambi generano lo stesso errore.

EDIT: Non c'è molto codice per mostrare, ma qui si va:

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

mostraci il codice bro –

+1

Il tuo Entità e il tuo tavolo hanno una chiave primaria? – Overmachine

+0

L'entità basata su una tabella reale (Cliente), l'entità basata sulla vista non lo fa poiché si basa su una vista. – Overhed

risposta

1

ero in grado di risolvere questo problema con la creazione di una stored procedure fittizio che non fa nulla ("SELEZIONA 'Fatto'") e utilizzando la mappatura delle funzioni SP nelle mie due viste per impostare la funzione Elimina su questa stored procedure. Un bel colpo ma ha funzionato.

Non sono sicuro del motivo per cui è necessaria una funzione di cancellazione per una vista o se sto facendo qualcosa di diverso che ha causato il problema, ma quanto sopra ha funzionato per me.

1

Molti i messaggi correlati in comune accordo con @Overmachine ... si sono probabilmente manca una chiave primaria sul vostro soggetto/tavolo.

vedere ..

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

e

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


EDIT

appena visto il tuo commento per quanto riguarda la vostra 012.tabella con una chiave primaria ma la tua vista no. Non è sicuro che cosa sta succedendo senza altro codice, ma alla fine tutto ciò che serve è un oggetto Customer con le chiavi principali impostate su di esso, quindi è possibile utilizzare il codice seguente per eliminare un oggetto entità indipendente.

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

Se state lanciando da un altro tipo e che sta causando problemi, si potrebbe anche fare:

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

Ciao Chris, grazie per il tuo aiuto. Ho dimenticato di chiarire che sono su una versione precedente di EF (v4), quindi la maggior parte di ciò che hai pubblicato non si applica a me (ad esempio DBContext). Ho provato ad aggiornare la mia versione, ma molte cose si sono rotte e non ho il tempo di affrontarlo ora. – Overhed

0

Penso che dovresti utilizzare tutte le chiavi esterne in Visualizza. quando si utilizzano tutte le chiavi esterne e le chiavi primarie in vista è possibile aggiornare ed eliminare l'oggetto come cascata.

+0

Grazie per la risposta, ma non ho voluto * cancellare * nulla nella vista. Infatti ho disabilitato Delete Cascade e stavo ancora ricevendo lo stesso errore. Fondamentalmente ho dovuto definire una funzione di cancellazione fittizia con una stored procedure che non fa nulla e collega l'eliminazione alla vista affinché la logica funzioni. – Overhed

Problemi correlati