http://weblogs.asp.net/zeeshanhirani/archive/2010/07/23/removing-entity-from-a-related-collection.aspx spiega esattamente cosa ti è successo.
Supponendo di avere un qualcosa di design di classe come questo:
Entity Framework genererà le colonne chiave esterna richiesti e aggiungi NOT NULL
vincoli per loro, perché tutte le ricette saranno sempre associato esattamente un ControlUnit.
Quindi in fase di esecuzione si dovrà oggetti simili al seguente schema:
Ora il codice entra in gioco e cancellato il rapporto tra la ricetta oggetti e la loro Unità di controllo:
Cercando di salvare in questo momento, il database non ha un ID ControlUnit da inserire nella chiave esterna NOT NULL
colonna. Lo stato dell'oggetto corrente viola il diagramma delle classi sopra riportato e non può essere salvato su un layout di database che è stato generato supponendo che ogni Ricetta sia associata a una ControlUnit. Questo è il motivo per cui il database si rifiuta di salvare le modifiche e si vede l'eccezione.
Questo spiega anche perché funziona quando si rimuove il commento dalla linea di eliminazione dell'ente: l'entità viene rimossa dal database insieme al suo rapporto, in modo vincoli vengono violati, pertanto, non fa eccezione.
"Ma io impostare ON DELETE CASCADE
sul rapporto ..."
Sì, ma che viene attivato solo sulla eliminazione dell'oggetto, non sulla cancellazione del rapporto.Con ON DELETE CASCADE
set, questo dovrebbe funzionare:
controlUnitRepository.DeleteObject(_controlUnit);
// deletes the ControlUnit and all associated Recipe entities
Se si desidera attivare la cancellazione dei soggetti ricetta su cancellazione del loro rapporto con Unità di controllo, il vostro rapporto non dovrebbe essere una semplice associazione, ma piuttosto una composizione:
EF non supporta questo in modo nativo, ma è possibile emulare il comportamento utilizzando le relazioni di identificazione. Una volta che un'entità si trova in una relazione identificativa con un'entità padre e tale relazione viene rimossa, anche l'entità viene rimossa. Sembra che questa fosse la tua intenzione dall'inizio. Per ulteriori informazioni sull'identificazione della relazione, vedere Implementing identifying relationships with EF4 in cui ho implementato le relazioni di identificazione con EF4 e ho collegato a più materiale di lettura.
Ho avuto lo stesso problema di oggi e credo che questo sia un difetto di progettazione in Entity Framework. La relazione tra le tabelle in SQL Server indica "Elimina orfani" e pertanto dovrebbe funzionare. Funziona così in NHibernate. Fortunatamente puoi farlo funzionare seguendo la risposta di GraemeMiller e le relative domande. –