2010-06-17 32 views
26

Tôi đang sử dụng khung Entity trong ứng dụng web. ObjectContext được tạo ra theo yêu cầu (sử dụng HttpContext), từ đây phát mã:Khuôn khổ đối tượng MappingException: Loại 'XXX đã được ánh xạ nhiều hơn một lần

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString(); 
if (!HttpContext.Current.Items.Contains(ocKey)) 
{ 
    HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString)); 
} 
_eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel; 

Không phải tất cả thời gian, nhưng đôi khi tôi có ngoại lệ này:

System.Data.MappingException là unhandled theo mã người sử dụng tin nhắn = Các loại 'XXX' đã được ánh xạ nhiều lần. Source = System.Data.Entity

Tôi hoàn toàn bối rối và tôi không biết bất kỳ điều gì có thể gây ra sự cố này.

Ai đó có thể giúp tôi không?

Trả lời

19

Nó trông giống như một vấn đề đồng bộ hóa. Một giải pháp đơn giản sẽ có một đối tượng khóa chia sẻ (trong lớp học của bạn):

private static object _lock = new object(); 

Sau đó, mã của bạn trở thành:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString(); 

lock (_lock) { 
    if (!HttpContext.Current.Items.Contains(ocKey)) 
    { 
      HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString)); 
    } 
    _eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel; 

} 

Khối khóa cơ bản có nghĩa là một lần một sợi đi vào "khóa" khối, không có chủ đề nào khác có thể truy cập khối đó cho đến khi chuỗi đầu tiên kết thúc. Điều này sẽ ngăn chặn sự tranh chấp giữa phương thức "Chứa" và phương thức "Thêm".

Lưu ý: Nếu bất kỳ nơi nào khác trong ứng dụng của bạn đang truy cập bộ sưu tập Mục trong HttpContext.Current, bạn cũng sẽ cần phải đồng bộ hóa ở đó. Bạn nên tạo bộ sưu tập tùy chỉnh, thêm bộ sưu tập này vào bộ sưu tập Các mục và đồng bộ hóa quyền truy cập vào bộ sưu tập này.

+0

Cảm ơn bạn! Bây giờ nó là tốt. – Michal

+0

Tôi đang sửa lỗi cho dự án Silverlight cũ và kém được viết. Đây là một trong những vấn đề thường xảy ra với RIA Services. Bây giờ tôi đang đặt ổ khóa cố gắng để ngăn chặn nó. – Vad

10

này là do khi bạn có multi-threading xảy ra và bạn đang truy cập ObjectContext cùng mà không cần đồng bộ hóa các chủ đề đầu tiên ...

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