2011-09-05 24 views
49

Tôi hơi bối rối về việc có nên sử dụng DbSet.Create hay chỉ đơn giản là tạo một thực thể mới và thêm nó. Tôi không thực sự hiểu các chi nhánh của việc sử dụng DbSet.Create.Phép tính của DbSet.Create so với thực thể mới()

Tôi hiểu rằng DbSet.Create sẽ tạo phiên bản proxy nếu có, nhưng tôi thực sự không hiểu điều đó có nghĩa là gì. Sao tôi phải quan tâm? Dường như với tôi rằng một lớp Proxied rỗng không hữu ích hơn một lớp không được ủy quyền, vì không có các thực thể liên quan đến tải lười.

Bạn có thể cho tôi biết sự khác biệt, ngoài hiển nhiên không? Và tại sao bạn sẽ quan tâm?

Trả lời

51

Trường hợp sử dụng DbSet<T>.Create() có ý nghĩa là gắn thực thể hiện tại vào ngữ cảnh và sau đó tận dụng tải chậm các thực thể có liên quan. Ví dụ:

public class Parent 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Sau đây sẽ làm việc sau đó:

using (var context = new MyDbContext()) 
{ 
    var parent = context.Parents.Create(); 
    parent.Id = 1; // assuming it exists in the DB 
    context.Parents.Attach(parent); 

    foreach (var child in parent.Children) 
    { 
     var name = child.Name; 
     // ... 
    } 
} 

tải Dưới đây lười biếng của trẻ em được kích hoạt (có lẽ với kết quả là bộ sưu tập trống rỗng, nhưng không null). Nếu bạn thay thế context.Parents.Create() theo new Parent() vòng lặp foreach sẽ bị lỗi vì parent.Children luôn là null.

Sửa

Một ví dụ khác là ở đây (Populating một tài sản quan trọng đối ngoại của một thực thể mới và sau đó nhận được tài sản chuyển hướng lười biếng nạp sau khi đơn vị mới được đưa vào DB): Lazy loading properties after an insert

+3

Ahh. Tôi đã không nhận ra rằng bạn chỉ có thể cư trú một id khóa nước ngoài và có nó lười biếng tải nó mà không có tất cả các fuss. Tôi đoán tôi có thể thấy làm thế nào mà có thể hữu ích nếu bạn không muốn tải các bản ghi hiện có và chỉ muốn con. –

+0

Phải làm gì nếu "context.Parents" là null, tôi đang thử trường hợp của bạn và có vẻ như nó là hoàn toàn khả thi nhưng không may cho tôi "context.Parents" là null vì vậy ngoại lệ này tạo ra như Ngoại lệ loại 'System.NullReferenceException 'xảy ra trong YourProject.dll nhưng không được xử lý trong mã người dùng Thông tin bổ sung: Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng. Nếu bạn có bất kỳ giải pháp nào, vui lòng cho tôi biết, vì vậy tôi sẽ khắc phục và viết vào các ghi chú của tôi để thoát khỏi các lần xuất hiện tiếp theo. –

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