8

Trong ASP NET MVC 3 với Entity Framework, tôi có một đối tượng miền trong đó có một tài sản chuyển hướng tham khảo đối tượng khác, như sau:Làm thế nào để cập nhật các thuộc tính định hướng của một thực thể trong Entity Framework

public class Person 
{ 
    public String Name {get;set;} 

    public Guid CompanyID{get;set;} 

    [ForeignKey(CompanyID)] 
    public virtual CompanyType Company{ get; set; } 
} 

Khi tôi tạo một cá thể của Person và cố gắng thêm nó vào cơ sở dữ liệu, DBContext giữ một bộ nhớ cache của thực thể này là 'Person' và gửi nó đến cơ sở dữ liệu. Vì vậy, sau này trong cuộc đời của cùng một bối cảnh, khi tôi cố gắng truy cập thực thể này, trường Công ty luôn luôn là rỗng vì thuộc tính điều hướng không bao giờ được cập nhật.

Có cách nào để cập nhật thuộc tính điều hướng với những gì tồn tại trong cơ sở dữ liệu không?

Tải trọng lười được bật.

Trả lời

11

Nếu lười tải được bật và bạn muốn tải các tài sản với tải lười biếng chuyển hướng bạn phải tạo một proxy của một mới Person, không nhanh chóng nó với new, như vậy:

using (var context = new MyDbContext()) 
{ 
    var person = context.People.Create(); // creates a lazy loading proxy 
    person.CompanyID = 123; 
    context.People.Add(person); 
    context.SaveChanges(); 

    var company = person.Company; // lazy loading query happens here 
} 

Nếu không tải lười biếng bạn có thể sử dụng tải rõ ràng:

using (var context = new MyDbContext()) 
{ 
    var person = new Person(); 
    person.CompanyID = 123; 
    context.People.Add(person); 
    context.SaveChanges(); 

    context.Entry(person).Reference(p => p.Company).Load(); // explicit loading 

    var company = person.Company; // no query anymore, Company is already loaded 
} 
+0

Điều này yêu cầu chương trình tải lại rõ ràng mọi thuộc tính điều hướng tồn tại. Có cách nào để thực hiện một cái gì đó cơ bản hơn, để tải lại tất cả các thuộc tính navigatio cho bất kỳ mục thực thể nào? Tôi đã thử chức năng Reload cho DbEntityEntry nhưng điều đó dường như không hoạt động. – daniely

+0

@daniely: Không, điều đó là không thể. Cách duy nhất với một DB rountrip đơn sẽ là sử dụng tải háo hức với nhiều 'Bao gồm' để tải tất cả các thuộc tính chuyển hướng. Nhưng điều này sẽ tải thực thể cha mẹ là tốt và bạn phải viết 'Bao gồm' cho tất cả các thuộc tính chuyển hướng bằng tay. – Slauma

+0

@Slauma Khi sử dụng context.People.Include (p => p.NavProp1) .Include (p => p.NavProp2) Tôi có thể chain-load một số thuộc tính navigaton tạo một hit duy nhất cho DB. Có cách nào tương tự để tải một số thuộc tính điều hướng với context.Entry (người) .Reference (...)? Tôi không thể tìm ra một cách để xác định tất cả các thuộc tính nav vì vậy tôi chỉ có thể gọi Load() một lần. –