2012-12-19 12 views
7

Ho un uno-a-molti unidirezionale tra il contatto e il telefono definita in questo modo:unidirezionale uno-a-molti con codice Prima

class Contact { 
    int ContactId {get; set} 
    ICollection<Phone> Phones {get; set} 
} 
class Phone { 
    int PhoneId {get; set;} 
    string PhoneNumber {get; set;} 
} 

Ora nello strato di dominio, ci provo effettuare le seguenti operazioni:

someContact.Phones.Remove(somePhone); 

e quando provo a chiamare context.SaveChanges() ottengo un'eccezione perché il rapporto è definito come richiesto (es. un telefono non può esistere senza un contatto).
Come posso risolvere questo senza utilizzare una chiave esterna o una proprietà di navigazione in Telefono e senza la necessità di chiamare DbSet<Phone>.Remove(Phone) prima di chiamare SaveChanges()?

+1

Non si può semplicemente aggiungere un 'RemovePhone()' -Metodo a contattare? E cosa vuoi che succeda se Mr e Mrs Smith sono entrambi nel tuo database con lo stesso telefono e solo il signor Smith cancella il suo account? – efkah

+0

Vuoi che il telefono sia cancellato dal database o semplicemente scollegato dal contatto? In che modo EF dovrebbe sapere che il telefono dovrebbe essere cancellato se non si definisce una relazione tra questo e i contatti? – lintmouse

risposta

0

C'è un modo per eseguire entrambe le staffe che Matteo ha descritto nel singolo passaggio. Richiede un piccolo cambiamento nel modello: è necessario aggiungere una chiave esterna all'entità Phone e creare una chiave composta che contenga sia PhoneId sia ContactId.

Ciò rende l'istanza della classe Phone legata all'istanza della classe Contact. Con queste impostazioni, quando si rimuove un telefono dal contatto someContact.Phones.Remove(somePhone);, EF rimuove il telefono dal DB, poiché sa che il telefono non può esistere senza connessione a quel particolare contatto.

Modelli:

public class Contact { 
    public int ContactId { get; set; } 
    public virtual ICollection<Phone> Phones { get; set; } 
} 

public class Phone { 
    public int PhoneId { get; set; } 
    public int ContactId { get; set; } 
    public string PhoneNumber { get; set; } 
} 

Configurazione:

modelBuilder.Entity<Contact>() 
    .HasMany(o => o.Phones) 
    .WithRequired() 
    .HasForeignKey(f => f.ContactId) 
    .WillCascadeOnDelete(true); 

modelBuilder.Entity<Phone>() 
    .HasKey(o => new { o.PhoneId, o.ContactId }); 
+0

la soluzione è intelligente, ma viola uno dei vincoli che ho menzionato nella mia domanda, quindi è un hack, e posso trovare altri hack per fare la stessa cosa. volevo sapere se poteva essere fatto senza fornire proprietà di navigazione estranee o bidirezionali e penso che (almeno nella versione attuale di EF) non possa essere fatto. –

Problemi correlati