2012-12-19 27 views
7

Tôi có một mối quan hệ một-nhiều uni-directional giữa Liên và điện thoại được định nghĩa như thế này:Uni-directional một-nhiều mối quan hệ với Mã Đầu tiên

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

Bây giờ trong lớp miền, tôi cố gắng phải làm như sau:

someContact.Phones.Remove(somePhone); 

và khi tôi cố gắng để gọi context.SaveChanges() tôi nhận được một ngoại lệ vì mối quan hệ được định nghĩa là cần thêm (. ví dụ như một chiếc điện thoại không thể tồn tại mà không cần một số liên lạc).
Làm cách nào tôi có thể giải quyết vấn đề này mà không cần sử dụng khóa ngoài hoặc thuộc tính điều hướng trong Điện thoại mà không cần gọi DbSet<Phone>.Remove(Phone) trước khi gọi SaveChanges()?

+1

không thể bạn chỉ cần thêm một 'RemovePhone() '-Method để liên hệ? Và bạn muốn điều gì xảy ra nếu cả ông và bà Smith đều ở trong Cơ Sở Dữ Liệu của bạn cùng điện thoại và chỉ có ông Smith mới xóa tài khoản của mình? – efkah

+0

Bạn có muốn xóa điện thoại khỏi cơ sở dữ liệu hoặc chỉ cần hủy liên kết khỏi liên hệ không? EF nên biết rằng điện thoại sẽ bị xóa nếu bạn không xác định mối quan hệ giữa nó và danh bạ? – lintmouse

Trả lời

1

Bạn về cơ bản đã trả lời câu hỏi của riêng bạn, như là hai điều bạn mô tả là riêng biệt:

  1. Bỏ liên kết các đối tượng
  2. Xóa đối tượng

Có thể có một cách thông minh cho EF để làm điều này, nhưng những người khác đã hỏi cùng một câu hỏi và được trình bày với câu trả lời bạn đã ám chỉ:

ví dụ: EF 4.1: Removing child object from collection does not delete it - why?

0

Có cách để thực hiện cả hai hình ảnh mà Matthew mô tả trong một bước. Nó đòi hỏi một chút thay đổi trong mô hình của bạn - bạn phải thêm khóa ngoài vào thực thể Phone và tạo khóa tổng hợp chứa cả hai PhoneIdContactId.

Điều này làm cho phiên bản của lớp Phone được gắn với phiên bản của lớp Contact. Với các cài đặt này, khi bạn xóa điện thoại khỏi số liên lạc someContact.Phones.Remove(somePhone);, EF sẽ xóa điện thoại khỏi DB vì điện thoại không thể tồn tại mà không kết nối với liên hệ cụ thể đó.

Models:

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

Cấu hình:

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

giải pháp của bạn là thông minh, nhưng nó vi phạm một trong những hạn chế mà tôi đã đề cập trong câu hỏi của tôi vì vậy nó là hack, và tôi có thể tìm thấy hack khác để làm cùng một suy nghĩ. Tôi muốn biết nếu nó có thể được thực hiện mà không cung cấp tài sản chuyển hướng nước ngoài hoặc hai hướng và tôi nghĩ rằng (ít nhất là trong phiên bản hiện tại của EF) nó không thể được thực hiện. –

Các vấn đề liên quan