2014-07-11 15 views
12

Tôi có một cơ sở dữ liệu hiện có với hai bảng MailServersMailDomains trong đó. MailDomains có cột khóa ngoài MailServerId trỏ đến cột chính Id chính trong MailServers. Vì vậy, chúng tôi có mối quan hệ một - nhiều ở đây.Entity Framework 6: Thêm đối tượng con vào danh sách của cha mẹ so với thuộc tính điều hướng của thiết lập cho cha mẹ

Tôi đã theo dõi this article và tạo POCO khung thực thể của mình thông qua mô hình "Mã đầu tiên từ cơ sở dữ liệu" trong Trình hướng dẫn mô hình dữ liệu thực thể. Điều này tạo ra hai lớp C# sau:

public partial class MailServer 
{ 
    public MailServer() 
    { 
     MailDomains = new HashSet<MailDomain>(); 
    } 

    public int Id { get; set; } 

    public virtual ICollection<MailDomain> MailDomains { get; set; } 
} 



public partial class MailDomain 
{ 
    public MailDomain() 
    { 
    } 

    public int Id { get; set; } 

    public string DomainName { get; set; } 

    public int MailServerId { get; set; } 
    public virtual MailServer MailServer { get; set; } 
} 

Bây giờ câu hỏi của tôi là liệu có sự khác biệt nào giữa hai cách tiếp cận tạo và chèn đối tượng mới vào cơ sở dữ liệu.

Tiếp cận (A): Thêm trẻ mới vào danh sách của cha mẹ:

 var mailServer = new MailServer(); 
     var mailDomain = new MailDomain() { 
      DomainName = "foobar.net", 
     }; 
     mailServer.MailDomains.Add(mailDomain); 

     using(var context = new MyContext){ 
      context.MailServers.Add(mailServer); 
      context.SaveChanges(); 
     } 

Approach (B): Thiết lập tài sản chuyển hướng của trẻ để phụ huynh:

 var mailServer = new MailServer(); 
     var mailDomain = new MailDomain() { 
      DomainName = "foobar.net", 
      MailServer = mailServer, 
     }; 

     using(var context = new MyContext){ 
      context.MailDomains.Add(mailDomain); 
      context.SaveChanges(); 
     } 

Tôi cũng giả định rằng trong cách tiếp cận (A) phiên bản MailDomain mới được tự động thêm vào bộ sưu tập context.MailDomains trong khi tiếp cận (B) phiên bản MailServer mới được tự động thêm vào bộ sưu tập context.MailServers. Điều đó đúng hay tôi phải làm điều đó theo cách thủ công?

Vì vậy, một lần nữa, câu hỏi của tôi là: hai phương pháp có thể hoán đổi cho nhau không? Nó chỉ gây nhầm lẫn cho tôi rằng trong cơ sở dữ liệu chỉ có một thuộc tính/cột để đặt (cụ thể là khóa ngoài trong MailDomains) trong khi mã C# có hai thuộc tính (một trong mỗi lớp) có thể được sửa đổi.

Trả lời

6

Có, hai phương pháp có thể hoán đổi cho nhau. Điều này cho phép bạn tạo và lưu biểu đồ đối tượng của bạn vào cơ sở dữ liệu từ phối cảnh của MailServer hoặc MailDomain.

Nếu bạn làm mã đầu tiên, bạn có tùy chọn xóa thuộc tính và ánh xạ nếu chúng không cần thiết.

tôi cũng giả định rằng trong cách tiếp cận (A) Ví dụ MailDomain mới được tự động thêm vào context.MailDomains trong khi trong cách tiếp cận (B) dụ MailServer mới được tự động thêm vào context.MailServers. Điều đó có đúng không hoặc tôi có phải làm điều đó theo cách thủ công không?

Điều đó phụ thuộc vào ý bạn là "được thêm vào ngữ cảnh". Nếu bạn có nghĩa là: nó sẽ tự động được lưu vào cơ sở dữ liệu khi bạn vẫn tồn tại, câu trả lời là có. Một trong những lợi ích lớn khi sử dụng ORM như EF là nó xử lý việc lưu một đồ thị đầy đủ một cách tự động (và đồng bộ các quan hệ PK/FK, vv).

Nếu bạn muốn: thực thể sẽ có sẵn thông qua ngữ cảnh trước khi lưu, tôi không nghĩ vậy (tôi không chắc chắn 100%).

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