2008-10-10 8 views
8

Có ai có một số thông tin tốt về cách sử dụng phương thức .SaveChanges() không?Cách tốt nhất để sử dụng phương thức .SaveChanges() trong các dịch vụ dữ liệu ADO.Net là gì?

Tôi gặp phải nhiều sự cố khi cố sử dụng phương thức .SaveChanges() trên đối tượng ngữ cảnh dữ liệu của tôi. Tôi đang lấy dữ liệu từ một nguồn dữ liệu hiện có, tạo các đối tượng EntityFramework/DataService thích hợp, điền các đối tượng đã tạo với dữ liệu, thêm các đối tượng đó vào ngữ cảnh và sau đó lưu dữ liệu đó bằng cách gọi .SaveChanges.

Các kịch bản mà tôi đã đưa ra (và các vấn đề liên quan đến chúng) là như vậy ... Trong mỗi trường hợp, tôi có vòng lặp foreach đang lấy dữ liệu từ các hàng trong một DataTable và tạo các đối tượng, đính kèm chúng với bối cảnh khi họ đi. (lưu ý: ba đối tượng là "thành viên" và hai "địa chỉ" được đính kèm qua cuộc gọi SetLink) - về cơ bản đây là công cụ chuyển đổi để lấy dữ liệu từ một kho dữ liệu và đưa nó vào kho dữ liệu được Dịch vụ Dữ liệu tiếp xúc.

  • .SaveChanges Gọi() mà không cần bất kỳ thông số một lần vào cuối vòng lặp foreach (tức là bên ngoài vòng lặp)
    • lỗi OutOfMemory khoảng 1/3 đường (30.000 ra 90.000 tiết kiệm) - không chắc chắn làm thế nào điều đó xảy ra mặc dù mỗi tiết kiệm mục là một cuộc gọi SQL riêng biệt đến cơ sở dữ liệu, những gì đang có để chạy ra khỏi bộ nhớ trên?
  • .SaveChanges Gọi() mà không cần bất kỳ thông số lần mỗi vòng lặp
    • này hoạt động, nhưng phải mất absolutly mãi mãi (8 giờ cho 90.000 tiết kiệm)
  • .SaveChanges Gọi (SaveChangesOption.Batch) một lần ở cuối vòng lặp foreach
    • Lỗi OutOfMemory giống nhau, nhưng không lưu vào cơ sở dữ liệu
  • .SaveChanges Gọi (SaveChangesOption.Batch) một lần mỗi vòng lặp không tìm thấy
    • 404 lỗi
  • Gọi .SaveChanges (SaveChangesOption.Batch) một lần mỗi 10 vòng
    • 400 Lỗi yêu cầu Xấu (Thỉnh thoảng)
    • OutOfMemory sau một số lần xuất hiện
  • Một số lần thử ngẫu nhiên để tạo ngữ cảnh một lần trên mỗi vòng lặp hoặc biến nó thành một biến ở đầu vòng lặp hoặc biến nó thành một biến thành viên riêng tư có sẵn.
    • kết quả khác nhau, không thể xác định số lượng, không ai thực sự là tốt

phương pháp ưa thích gọi .SaveChanges() từ một đối tượng khách hàng khi thực hiện tải dữ liệu lớn như thế này là gì? Có cái gì tôi không nhận được về cách .SaveChanges() hoạt động? Bất cứ ai có thể cung cấp thêm chi tiết về cách một lần nên được sử dụng chức năng này và những gì (nếu có) là những hạn chế để tiết kiệm dữ liệu thông qua dịch vụ dữ liệu?Có bất kỳ phương pháp hay nhất nào quanh cuộc gọi phương thức .SaveChanges() không? Có bất kỳ tài liệu đặc biệt tốt nào về cuộc gọi phương thức .SaveChanges() không?

+0

bạn đang triển khai "thay đổi" nào? Tại sao 90.000 tiết kiệm? Có lẽ bạn nên thử sao chép SQL, nếu bạn chỉ cần truyền dữ liệu? chỉ là một ý nghĩ. – D3vtr0n

+0

chỉ để làm rõ, khi bạn nói "một lần cho mỗi vòng lặp", bạn có nghĩa là một cuộc gọi cho mỗi vòng lặp * lặp *? – Veverke

Trả lời

3

Tôi không có kinh nghiệm lớn trong việc sử dụng EntityFramework (chỉ một số thí nghiệm ngẫu nhiên), bạn đã thử .SaveChanges gọi() mỗi n lần lặp?

Ý tôi là một cái gì đó như thế này:

int i = 0; 
foreach (var item in collection) 
{ 
    // do something with your data 
    if ((i++ % 10) == 0) 
     context.SaveChanges(); 
} 
context.SaveChanges(); 

Tôi biết đó là xấu xí, nhưng đó là giải pháp đầu tiên có thể tôi đã đưa ra.

+0

điều này dường như là một trong những giải pháp tốt hơn có sẵn (đặc biệt là cân bằng sử dụng bộ nhớ và tốc độ) - nó dường như thực hiện tốt hơn lớn hơn bạn làm cho số itterations n (cho đến khi bạn nhấn giới hạn bộ nhớ). tôi vẫn chưa có phương pháp dứt khoát hoạt động trong mọi tình huống. – ChrisHDog

0

Tôi đang sử dụng EntityFramework trên một dự án nhỏ cũng vì vậy tôi cũng rất quan tâm đến câu hỏi này. Hai câu hỏi nhanh: Bạn đã cố gắng bật bộ nhớ đệm và các đối tượng dữ liệu trong datacontext? Bạn đã cố gắng đóng datacontext và tạo một tài liệu mới trong vòng lặp để giải phóng bộ nhớ?

Trân

Kenneth

+0

tạo ra một ngữ cảnh mới trong vòng lặp miễn phí lên bộ nhớ mà không giúp đỡ, nhưng sau đó làm cho tiết kiệm lâu hơn (có vẻ là một số cải tiến bằng cách xử lý các nhóm lớn hơn của các mặt hàng). làm thế nào để một trong những bộ nhớ đệm của các đối tượng dữ liệu? – ChrisHDog