Làm quen với Khung thực thể, tôi thực sự khá mắc kẹt về cách tiếp tục với bộ vấn đề này. Về dự án tôi hiện đang làm việc, toàn bộ trang web được tích hợp rất nhiều với mô hình EF. Đầu tiên, việc truy cập vào bối cảnh EF đã được kiểm soát bằng cách sử dụng bootstrapper Dependency Injection. Vì lý do hoạt động, chúng tôi không thể sử dụng thư viện DI. Tôi đã loại bỏ điều này và sử dụng một mô hình cá thể của đối tượng ngữ cảnh khi được yêu cầu. Tôi bắt đầu nhận được ngoại lệ sau:Khuôn khổ và giao dịch .NET Entity
Loại 'XXX' đã được ánh xạ nhiều lần.
Chúng tôi đi đến kết luận rằng các trường hợp khác nhau của bối cảnh đã gây ra vấn đề này. Sau đó tôi đã trừu tượng đối tượng ngữ cảnh thành một cá thể tĩnh đơn lẻ đang được truy cập bởi mỗi luồng/trang. Tôi hiện đang nhận được một trong một số ngoại lệ về giao dịch:
Giao dịch mới không được phép vì có các chủ đề khác đang chạy trong phiên.
Không thể thực hiện thao tác giao dịch vì có yêu cầu đang chờ xử lý làm việc trên giao dịch này.
ExecuteReader yêu cầu lệnh để có giao dịch khi kết nối được gán cho lệnh nằm trong giao dịch địa phương đang chờ xử lý. Thuộc tính Giao dịch của lệnh chưa được khởi tạo.
Trường hợp ngoại lệ cuối cùng xảy ra trong quá trình tải. Tôi đã không cố gắng để lưu trạng thái bối cảnh trở lại Db trên thread mà không thành công. Có một thread khác thực hiện một hoạt động như vậy tuy nhiên.
Những ngoại lệ này không liên tục ở mức tốt nhất, nhưng tôi đã quản lý để đưa trang web vào trạng thái nơi các kết nối mới bị từ chối do khóa giao dịch. Rất tiếc, tôi không thể tìm thấy chi tiết ngoại lệ.
Tôi đoán câu hỏi đầu tiên của mình là, liệu mô hình EF có được sử dụng từ một cá thể đơn lẻ không? Ngoài ra, có thể loại bỏ nhu cầu giao dịch trong EF không? Tôi đã thử sử dụng một đối tượng TransactionScope
mà không thành công ...
Thành thật mà nói, tôi rất nhiều khó khăn ở đây, và không thể hiểu tại sao (những gì phải là) hoạt động đơn giản đang gây ra vấn đề như vậy ...
Liên quan: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven
Quá xấu bạn không thể sử dụng bootstrapper IOC, vì giải pháp có [Ninject] (http : //www.ninject.org/) sẽ liên kết một cá thể "phổ biến" với phạm vi _request_, như những người khác đã gợi ý: 'kernel.Bind>(). > () .InRequestScope(); '- phần quan trọng là **' InRequestScope' ** –
drzaus