6

Tôi phải cập nhật một trang web hiện có dựa trên DDS trên cùng của Khuôn khổ thực thể và sử dụng ba mô hình cơ sở dữ liệu khác nhau từ ba cơ sở dữ liệu khác nhau. Và những gì nó cần là một bổ sung đơn giản cho trang ListDetails: một nút xuất sang nút XML ...
Việc thêm nút rất dễ dàng. Việc tạo ra XML cũng không khó. Thách thức là nhận được bảng thích hợp để xuất, đi qua tất cả các bản ghi và các trường và tạo XML dựa trên bất kỳ bảng nào trong số hơn 100 bảng trong hệ thống!
Vì vậy, nút của tôi gọi trình xử lý xuất (ashx) tạo XML dựa trên tên của người mà nó nhận được thông qua các tham số của nó. Mã tôi có là một cái gì đó như thế này:Xuất sang XML từ trang dữ liệu động

 Content_CobaEntities Coba = new Content_CobaEntities(); 
     MetadataWorkspace metadataWorkspace = Coba.MetadataWorkspace; 
     EntityContainer container = metadataWorkspace.GetItems<EntityContainer>(DataSpace.CSpace).First(); 
     string namespaceName = metadataWorkspace.GetItems<EntityType>(DataSpace.CSpace).First().NamespaceName; 
     EntitySetBase entitySetBase = container.BaseEntitySets.FirstOrDefault(set => set.ElementType.Name == Entity); 

Thật không may, điều này chỉ làm việc với một bối cảnh duy nhất và tôi tình cờ có ba. (Nhưng điều này là bối cảnh chính.) (Bên cạnh đó, một tham số thứ hai có thể được sử dụng để xác định bối cảnh thích hợp.) Và mặc dù nó cho phép tôi xác định loại thực thể cần thiết, nó vẫn không cung cấp cho tôi quyền truy cập vào hồ sơ của nó và các trường.

Vì vậy, làm cách nào để nhận dữ liệu cho pháp nhân này? (Bộ lọc không quan trọng; quá trình xuất sẽ trả về tất cả dữ liệu.)

Và không, không có EF4. Không .NET 4. Đây là một dự án VS2008 cũ và không thể được sửa đổi để nhiều, và cũng không nó có thể được nâng cấp ...


Về cơ bản, chuỗi truy vấn chứa hai tham số: ContextID và QueryID. ContextID cho tôi biết bối cảnh nào cần sử dụng và vì tôi chỉ có ba ngữ cảnh khác nhau, một lệnh chuyển đổi đơn giản giải quyết vấn đề này cho tôi. Nhưng một trong các ngữ cảnh chứa hơn 60 truy vấn, mỗi truy vấn liên quan đến một bảng cơ sở dữ liệu duy nhất. Trang dữ liệu động cung cấp cho tôi các tùy chọn để thêm, chỉnh sửa và xóa các bản ghi từ bảng này nhưng nó cần được xuất ở định dạng được quyết định bởi mã tùy chỉnh của tôi. Nhưng với 60 bảng, nó là quá nhiều để viết một tuyên bố chuyển đổi cho mỗi và mọi truy vấn vì vậy tôi cần một cái gì đó chung chung hơn.

+0

Bạn có nói rằng bạn không thể kết nối với một ngữ cảnh EF khác ngoài ngữ cảnh chính không? – WVDominick

+0

Thực ra, trình xử lý xuất cũng phải có sẵn từ các vị trí khác và người dùng cần có khả năng đánh dấu nó. Tôi có thể có được ngữ cảnh thích hợp nhưng bây giờ tôi cần phải lặp qua truy vấn thích hợp, với tất cả các trường và giá trị để tạo XML tùy chỉnh. –

Trả lời

2

Khi nó quay ra, tôi làm cho mọi việc phức tạp hơn cần thiết ... Tôi bắt đầu với các thông số:

 string Entity = context.Request.QueryString.Get("Entity"); 
     string ContextID = context.Request.QueryString.Get("Context"); 

Sau đó, tôi cần phải xác định bối cảnh quyền sử dụng, đó là dễ dàng:

 ObjectContext Context; 
     if (ContextID.Contains("Content_LogEntities")) { Context = new Content_LogEntities(); } 
     else if (ContextID.Contains("Content_CobusEntities")) { Context = new Content_CobusEntities(); } 
     else { Context = new Content_CobaEntities(); }; 

Tiếp theo tôi cần lấy dữ liệu thích hợp trong bảng được yêu cầu. Cũng dễ dàng:

 ObjectQuery Tabel = Context.CreateQuery<EntityObject>(string.Format("[{0}]", Entity)); 

Không biết tại sao tôi cố gắng làm cho phần đó phức tạp hơn mức cần thiết.

Những gì còn lại là đi qua tất cả các lĩnh vực, nhưng tôi có một sự phản ánh công việc xung quanh:

 foreach (var rec in Tabel) 
     { 
      foreach (PropertyInfo Prop in rec.GetType().GetProperties()) 
      { 
       // Blah 
      } 
     } 

Các Blah phần kiểm tra Prop.Name Để xem nếu nó là một chìa khóa tổ chức nào, nhà nước tổ chức, bộ sưu tập con hoặc tham chiếu hoặc nếu đó chỉ là trường dữ liệu. Điều này cho phép tôi tạo ra một đầu ra XML thực tế.

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