2012-06-14 26 views
5

Tôi có bảng tra cứu và bảng dữ liệu trong db của mình. Tôi sẽ sử dụng giới tính và con người cho một ví dụ. Vì vậy, giả sử bảng giới trông giống như vậy:Mã khuôn khổ thực thể Trước tiên không tải chậm sau khi lưu

Id   Code 
1   Male 
2   Female 

và bảng người trông giống như vậy:

Id   Name    GenderId 
1   Bob    1 
2   Jane    2 

Tôi đã lập mô cả hai bảng trong mã EF đầu tiên như vậy:

public class Gender 
{ 
    public int Id {get;set;} 
    public string Code {get;set;} 
} 

public class Person 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int GenderId {get;set;} 

    public virtual Gender {get;set;} 
} 

Nếu tôi đọc một người đã có trong DB thì tôi có thể truy cập person.Gender.Code mà không gặp vấn đề gì. Nếu tôi làm điều này:

var person = new Person 
      { 
       Name = "Bob", 
       GenderId = 1, 
      }; 

context.People.Add(person); 
context.SaveChanges(); 

var code = person.Gender.Code; 

Sau đó, nó sẽ lưu chính xác nhưng sẽ không thành công trên dòng cuối cùng là giới tính là rỗng. Nếu sau đó tôi mở một bối cảnh mới và tải thực thể đã lưu thì dòng cuối cùng hoạt động tốt. Có cách nào để tôi có thể truy cập trực tiếp giới tính sau khi lưu như thể tôi vừa nạp thực thể từ DB?

+0

Câu cuối cùng là chưa hoàn thành, bạn có thể sửa chữa nó? –

+0

Xin lỗi về điều đó, nó đã không lưu lần đầu tiên và khi tôi trở lại trang, nó không phải đã tải toàn bộ điều. – VARAK

Trả lời

8

Vấn đề của bạn là khi bạn sử dụng new Person() nó sẽ chỉ tạo đối tượng POCO không biết cách lấy thuộc tính Gender của nó. Vì vậy, để thực hiện công việc tải chậm, bạn cần proxies.

Bạn có thể tạo người của bạn như là một proxy với DbSet.Create():

var person = context.People.Create(); 
person.Name = "Bob"; 
person.GenderId = 1; 

context.People.Add(person); 
context.SaveChanges(); 
+0

Cảm ơn bạn !! Đoạn mã đầu tiên hoạt động rất tốt. Cái thứ hai sẽ thích hợp hơn nhưng nó không hoạt động. Có vẻ như nó chỉ phun ra phiên bản được lưu trong bộ nhớ cache của người không có tải chậm. – VARAK

+0

Có vẻ như 'Tìm()' sẽ không trả lại một proxy ... Bạn có thể thử nó với 'context.People.Single (p => p.Id == person.Id)'? – nemesv

+0

'Single' cũng không hoạt động. Tuy nhiên, nếu bạn gọi 'context.People.Load();' trước 'Find' hoặc' Single' nó hoạt động, nhưng nó sẽ tải lại bộ sưu tập vào ngữ cảnh. Vì vậy, tôi nghĩ bạn nên sử dụng 'Create' để tạo proxy để tôi đã xóa phần liên quan 'Tìm kiếm' của câu trả lời của tôi. – nemesv

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