2012-12-19 10 views
7

Mam jeden-do-wielu jednokierunkowych relacji między Kontakt i telefonu zdefiniowany następująco:Jednokierunkowy jeden-do-wielu z Code First

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

Teraz w warstwie domeny, próbuję aby wykonać następujące czynności:

someContact.Phones.Remove(somePhone); 

i gdy próbuję zadzwonić context.SaveChanges() uzyskać wyjątek, ponieważ związek jest określony jako wymagany (np. telefon nie może istnieć bez kontaktu).
Jak mogę to rozwiązać bez użycia klucza obcego lub właściwości nawigacji w telefonie i bez potrzeby dzwonienia pod numer DbSet<Phone>.Remove(Phone) przed dzwonieniem pod numer SaveChanges()?

+1

nie można po prostu dodać 'RemovePhone()' -Method się skontaktować? I co chcesz zrobić, jeśli Pan i Pani Smith są w bazie danych z tym samym telefonem i tylko Pan Smith usuwa swoje konto? – efkah

+0

Czy chcesz, aby telefon został usunięty z bazy danych lub po prostu usunięty z kontaktu? Jak EF powinien wiedzieć, że telefon powinien zostać usunięty, jeśli nie zdefiniujesz relacji między nim a kontaktami? – lintmouse

Odpowiedz

0

Istnieje sposób na wykonanie obu stap, które Mateusz opisał w jednym kroku. Wymaga to niewielkiej zmiany w modelu - musisz dodać klucz obcy do jednostki Phone i utworzyć klucz złożony zawierający zarówno PhoneId, jak i ContactId.

Dzięki temu wystąpienie klasy Phone jest powiązane z wystąpieniem klasy Contact. Dzięki tym ustawieniom, po usunięciu telefonu z kontaktu someContact.Phones.Remove(somePhone);, EF usuwa telefon z DB, ponieważ wie, że telefon nie może istnieć bez połączenia z tym konkretnym kontaktem.

Modele:

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

Konfiguracja:

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

Twoje rozwiązanie jest sprytne, ale narusza jedno z ograniczeń, które wspomniałem w moim pytaniu, więc jest hackerem i mogę znaleźć inne hacki, by zrobić to samo. chciałem wiedzieć, czy można to zrobić bez zapewnienia obcej lub dwukierunkowej właściwości nawigacji i myślę (przynajmniej w obecnej wersji EF), że nie da się tego zrobić. –

Powiązane problemy