2009-10-02 28 views
11

Tôi đang viết lại đơn đăng ký của mình để sử dụng khung pháp nhân. Những gì tôi đang bối rối về là mã tôi đang viết có vẻ như nó đang làm cho chuyến đi không cần thiết các máy chủ sql. Ví dụ, tôi có một trang câu hỏi trả lời tương tự như SO. Khi tôi thêm câu trả lời cho câu hỏi - đây là mã tôi sử dụng:Tại sao Khung thực thể tạo ra nhiều vòng tròn cho cơ sở dữ liệu?

var qu = context.question.where(c => c.questionID == 11).First(); //Database call here 
var answer = new answer(); 
answer.title = "title here"; 
answer.desc = "desc here"; 
answer.question = qu; 
context.SaveChanges(); //Database call here 

Trong đoạn mã trên có 2 cuộc gọi cơ sở dữ liệu phải không? Nếu vậy, tại sao tôi không thể thêm câu trả lời cho câu hỏi trực tiếp? chẳng hạn như

var ans = answer.Createanswer (0, "title here", "desc here", questionID) 
context.SaveChanges(); 

Có cách nào để thu nhỏ tất cả các cuộc gọi cơ sở dữ liệu không?

+1

Tốt câu hỏi ... –

Trả lời

11

Theo giải thích của AlexJ một trong những nhà thiết kế EF http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

Ngoài ra điều này tất cả rơi vào lĩnh vực trên "tối ưu hóa" mà không thường đơn giản như nó có vẻ

Sử dụng các phương pháp đơn giản , SQL sẽ thực hiện thao tác đọc để tải FK (câu hỏi) và lưu vào bộ nhớ cache kết quả, và sau đó trên một lệnh riêng biệt, thao tác chèn sẽ sử dụng kết quả FK đã lưu trong bộ nhớ cache

. máy chủ làm một hoạt động đọc cho FK, nó chỉ có nghĩa là một chuyến đi ít vòng đến máy chủ SQL. Vì vậy, câu hỏi trở thành - theo thời gian là một chuyến đi vòng đắt hơn so với sự phức tạp mã tăng lên?

Nếu ứng dụng và SQL Server là trên cùng một máy overhead này là rất nhỏ

Ngoài ra, nếu FK là một nhóm chỉ số trên một bảng lớn hoặc rộng overhead IO có thể được nhiều hơn đáng kể hơn nếu nó là một chỉ số tiêu chuẩn riêng biệt trên chỉ là giá trị FK - giả định rằng optimizer truy vấn đang làm việc một cách chính xác :-)

-3

Nó có thể được thực hiện, nhưng nó rất đau đớn trong .NET 3.5. Họ đã thực hiện điều này dễ dàng hơn nhiều trong .NET 4.0.

8

Bạn thực sự không cần tải Câu hỏi để đặt mối quan hệ. Thay vào đó, bạn chỉ có thể sử dụng EntityReference

ví dụ:

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.EntityKey 
    = new EntityKey("MyContextName.Question", "Id", questionId); 

Cá nhân tôi sử dụng một phương pháp mở rộng cho thiết lập các phím thực thể

public static void SetEntityKey<T>(this EntityReference value, int id) 
{ 
    value.EntityKey = new EntityKey("ContextName." + typeof(T).Name, "Id", id); 
} 

Vì vậy, nó sẽ trông như thế này để thay thế.

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.SetEntityKey<Question>(questionId); 
+0

bạn không thể sử dụng 'EntityReference này ' để tránh sự rõ ràng khi gọi SetEntityKey? – devio

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