2012-12-19 26 views
7

Ich habe eine Eins-zu-viele unidirektionale Beziehung zwischen Kontakt und Telefon wie folgt definiert:Uni-direktionale einer Eins-zu-viele-Beziehung mit Code Ersten

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

nun in der Domänenschicht, ich versuche, folgendes zu tun:

someContact.Phones.Remove(somePhone); 

und wenn ich versuche, context.SaveChanges() ich eine Ausnahme erhalten zu nennen, weil die Beziehung nach Bedarf festgelegt (. zB ein Telefon kann ohne Kontakt nicht vorhanden ist).
Wie kann ich das lösen, ohne einen Fremdschlüssel oder eine Navigationseigenschaft in Telefon zu verwenden und ohne den Anruf DbSet<Phone>.Remove(Phone) vor dem Anruf SaveChanges()?

+1

können Sie nicht nur hinzufügen, eine 'RemovePhone()' -Methode kontaktieren? Und was möchten Sie tun, wenn Herr und Frau Smith mit demselben Telefon in Ihrer Datenbank sind und nur Herr Schmidt seinen Account löscht? – efkah

+0

Möchten Sie, dass das Telefon aus der Datenbank gelöscht oder vom Kontakt getrennt wird? Wie soll EF wissen, dass das Telefon gelöscht werden sollte, wenn Sie keine Beziehung zwischen ihm und Kontakten definieren? – lintmouse

Antwort

1

Sie beantwortet im Grunde Ihre eigene Frage, wie die beiden Dinge, die Sie beschreiben, sind getrennt:

  1. die für EF Objekt Aufheben der Verknüpfung
  2. löschen das Objekt

Es kann eine kluge Art und Weise sein, tun Sie das, aber andere haben die gleiche Frage gestellt und wurden mit der Antwort, auf die Sie hingewiesen haben, dargestellt:

z EF 4.1: Removing child object from collection does not delete it - why?

0

Es gibt eine Möglichkeit, beide Stapes zu machen, die Matthew im ersten Schritt beschrieben hat. Es erfordert eine kleine Änderung in Ihrem Modell - Sie müssen der Phone Entität einen Fremdschlüssel hinzufügen und einen zusammengesetzten Schlüssel erstellen, der sowohl PhoneId als auch ContactId enthält.

Dies macht die Instanz der Phone Klasse an die Instanz Contact Klasse gebunden. Wenn Sie mit diesen Einstellungen ein Telefon aus dem Kontakt someContact.Phones.Remove(somePhone); entfernen, entfernt EF das Telefon aus der Datenbank, da es weiß, dass das Telefon ohne Verbindung zu diesem bestimmten Kontakt nicht existieren kann. Modelle

:

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; } 
} 

Konfiguration:

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

Sie Lösung ist clever, aber es verletzt eine der Einschränkungen, die ich in meiner Frage erwähnt habe, so ist es Hack, und ich kann andere Hacks finden, um das gleiche zu denken. Ich wollte wissen, ob es getan werden könnte, ohne fremde oder bidirektionale Navigationseigenschaften bereitzustellen, und ich denke (zumindest in der aktuellen Version von EF) kann es nicht getan werden. –

Verwandte Themen