2012-04-13 34 views
12

Tôi đã tìm một chủ đề tương tự cho câu hỏi của mình trên internet trong vài ngày qua. Cuối cùng tôi đã tự hỏi mình câu hỏi này.Bản đồ kết quả thủ tục được lưu trữ trong Khuôn khổ thực thể

Sử dụng phương pháp mã đầu tiên và EF 4.3.1 Tôi đã tạo một lớp ngữ cảnh, các lớp thực thể và các lớp để lưu trữ đầu ra thủ tục được lưu trữ. Lớp ngữ cảnh có các phương thức thực hiện các thủ tục được lưu trữ nhất định sử dụng SqlQuery<T>.

Ví dụ:

public IEnumerable<Results> GetData(int id) 
{ 
    var parameters = new SqlParameter[] { new SqlParameter("@id", id) }; 
    var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id", parameters); 
    var data= result.ToList<Result>(); 

    return data; 
} 

Như tôi đang truy tìm debug của tôi dữ liệu của tôi trở lại, và dữ liệu được ánh xạ tới các thuộc tính với một tên phù hợp. Tuy nhiên, ở đầu ra có một cột có tên là "/" trong tên (ví dụ: Info/Data). Rõ ràng là tôi không thể đặt tên cho một tài sản như thế vì vậy tôi figured tôi có thể lập bản đồ đầu ra bằng cách sử dụng thuộc tính cột ([Column("Info/Data")]):

[Column("Info/Data")] 
public string InfoData 
{ 
    get { return infoData; } 
    set { infoData= value; } 
} 

Tôi thậm chí đã cố gắng sử dụng các nhà điều hành đúng nguyên văn ([Column(@"Info/Data")]), gói văn bản với [] ([Column("[Info/Data]")]) và tôi đã thử cả hai ([Column(@"[Info/Data]")]). Khi bước qua mã, tôi thấy rằng các thuộc tính với các tên cột phù hợp được gán, nhưng các thuộc tính với thuộc tính cột được bỏ qua và được bỏ qua trong quá trình gán.

Tôi cũng đã sử dụng lệnh lưu loát cho mỗi cột cho thực thể.

modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data"); 

nhưng mà ném ngoại lệ sau đây:

Người đọc dữ liệu không phù hợp với quy định 'NameSpace.Result'. Thành viên thuộc loại, 'InfoData', không có cột tương ứng trong trình đọc dữ liệu có cùng tên.

Trong dự án của tôi NameSpace.Result là một lớp (tên đã thay đổi đối với an ninh) và InfoDatais là tài sản mà tôi cố gắng để lập bản đồ sử dụng thông thạo-api (cột sql tương ứng có/ở trong đó; ví dụ: Thông tin/dữ liệu) .

Có ai đã gặp sự cố này không?

Nếu sự cố của tôi không rõ ràng hoặc đã được hỏi trước khi vui lòng cho tôi biết.

+7

Tôi tự hỏi loại người nào tên bảng Lớp học/Cơ sở dữ liệu với "/" tính cách. –

+0

Điều đó làm cho hai người chúng ta. Tôi không viết proc. Tôi được yêu cầu sử dụng dữ liệu. Nó rất khó chịu khi thấy sự bí ẩn xảy ra. –

+0

Có cơ hội tạo SP bao bọc với tên cột bình thường trong kết quả không? – vittore

Trả lời

3

Tôi nhận thấy đây là một câu hỏi cũ, nhưng vì nó đã được cập nhật bởi câu trả lời gần đây của OP, có lẽ vẫn còn quan tâm đến nó.

Nếu bạn bị kẹt với tập tin được lưu trữ như vậy và nó trả về tên cột không tương thích với EF, thấy khi bạn đang chuyển sang SQL để gọi trực tiếp cho proc với SqlQuery, bạn có thể sử dụng phương pháp INSERT-EXEC để làm một cái gì đó như tuyên bố một biến bảng (với tên cột tương thích hơn), INSERT-EXEC proc được lưu trữ vào biến bảng, sau đó chọn từ biến bảng như tập kết quả của bạn?

Nó sẽ là SQL dài để truyền vào và vì vậy tôi không phải là một giải pháp dễ chịu, nhưng như một bài tập suy nghĩ để xem đó là một cách xung quanh vấn đề tôi nghĩ tôi sẽ cung cấp nó lên. Bài viết hay ở đây về loại vấn đề này: http://www.sommarskog.se/share_data.html - hầu hết các phương pháp không hữu ích vì bạn không thể thay đổi proc đã lưu trữ của bạn (và vì vậy có lẽ ít hoặc không có quyền truy cập vào cấu trúc db hoặc thay đổi nó ở tất cả?), nhưng phương pháp INSERT-EXEC xuất hiện dưới dạng giải pháp có thể mà không cần thay đổi bất cứ điều gì ở cấp db ...

+0

Tôi đã hoàn toàn quên về Insert-Exec vì tôi chỉ đọc về nó và không bao giờ thực sự sử dụng nó. Đó là một giải pháp tốt hơn nhiều so với sử dụng OPENROWSET như tôi đã làm trong câu trả lời của tôi. Điều này chắc chắn là một giải pháp có thể vì nó sẽ cho phép bạn che giấu các tên cột được hình thành kém. –

0

Có thể không thực hiện được những gì bạn muốn. Khi sử dụng SQL thô, phần ánh xạ của EF bị bỏ qua.

How to use Entity Framework to map results of a stored procedure to entity with differently named parameters

Cùng một điều với ExecuteStoreQuery http://social.msdn.microsoft.com/Forums/pl/adonetefx/thread/d524b005-12a4-4300-a974-1e0582de876b

Bạn có thể sử dụng ObjectQuery để có được một danh sách các đối tượng DbDataRecord. Sau đó, sử dụng chức năng "Chọn" LINQ để ánh xạ kết quả cho loại đối tượng của bạn. Nếu bạn bọc ánh xạ đó trong một hàm mở rộng có một IEnumerable và trả về một IEnumberable.

Return Custom Object <List T> from Entity framework and assign to Object Data Source

+0

Tôi đã rời khỏi dự án mã đầu tiên và đi với nhà thiết kế trong trường hợp này. Nó sẽ ở lại theo cách này cho đến khi hỗ trợ lập bản đồ đến các cuộc gọi thủ tục được lưu trữ. Cảm ơn –

0

Quay trở lại và suy nghĩ về vấn đề này một trong những đơn giản nhất (có khả năng giải pháp không sạch hoặc tốt nhất) là để bọc toàn bộ tập hợp kết quả trong một thủ tục mới. Tất nhiên, nếu bạn có khả năng sửa đổi các thủ tục mà không vi phạm bất cứ điều gì đó là giải pháp tốt nhất của bạn.Tuy nhiên, nếu bạn không thể sửa đổi giải pháp đầu ra, hãy sử dụng OPENROWSET (Nhìn vào câu trả lời của Aaron) để lấy đầu ra của thủ tục vào một bảng và chọn mỗi cột với một bí danh mới hoạt động và tuân thủ các nguyên tắc lập trình rõ ràng hơn.

Tôi hy vọng điều này sẽ giúp mọi người trong tương lai.

LƯU Ý:
Tôi chưa kiểm tra xem phiên bản EF mới có giải quyết được vấn đề này không.

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