2011-10-31 32 views
5

Kịch bản của tôi Tôi đang sử dụng Visual Studio 2010 với Entity Framework 4.1 Tôi có một cơ sở dữ liệu kế thừa với nhiều bảng và nhiều thủ tục được lưu trữ. Tôi đang viết một chương trình ASP.NET C# sử dụng MVC 3Ánh xạ chọn các thủ tục lưu sẵn trong khung thực thể

Tôi đã sử dụng thiết kế 'cơ sở dữ liệu đầu tiên' bằng ADO.NET DbContext nên tôi có một bản edmx với tất cả các mô hình và liên kết và thuộc tính điều hướng được thiết lập độc đáo. Tôi có thể lập bản đồ chèn, cập nhật, xóa các thủ tục cho các mô hình có liên quan. Tôi đã sử dụng 'Nhập chức năng' để nhập các thủ tục được lưu trữ khác. Tuy nhiên, tôi không thể tìm thấy cách để ánh xạ các quy trình Chọn của tôi để chọn các hành động (chọn theo id, chọn danh sách, chọn theo bộ lọc, v.v.).

EF dường như sử dụng tải chậm nên những gì tôi muốn xảy ra là khi một đối tượng tìm nạp đối tượng con của nó, nó sử dụng các thủ tục đã lưu đã được viết. (Thủ tục chọn đưa vào tài khoản cờ 'isDeleted', và sử dụng 'ORDER BY' khoản, trong số những người khác)

tôi thấy từ bài viết này http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx mà LINQ to SQL cho phép kéo và thả các SPs, mà âm thanh, nhiều hơn hoặc ít hơn, chính xác những gì tôi muốn.

Tôi cũng đi qua thuật ngữ DefiningQuery. http://msdn.microsoft.com/en-us/library/cc982038.aspx Đây có phải là điều tôi muốn không? Tôi không thích ghi chú 'Bất kỳ thay đổi nào được thực hiện đối với mô hình lưu trữ, bao gồm việc xác định truy vấn, sẽ bị ghi đè khi bạn chạy Trình hướng dẫn mô hình cập nhật.'

Tóm lại, điều tôi muốn xảy ra là khi một đối tượng tìm nạp đối tượng con của nó, nó sử dụng các thủ tục đã lưu của tôi.

Tôi có thể đạt được mục tiêu của mình bằng cách sử dụng Khung thực thể không? Tôi đã bỏ lỡ điều gì đó hiển nhiên?

Hoặc tôi nên cố gắng để được thực sự thông minh và sửa đổi các mẫu db Entity T4, do đó, ví dụ, mô hình Địa chỉ tạo của tôi có khách sạn này:

public virtual ICollection<AddressLine> AddressLines { 
    get{ 
     DBWrapper _db = new DBWrapper(); 
     return _db.GetAddressLines(AddressID); 
    } 
    set{}; 
} 

nơi GetAddressLines là chức năng tùy chỉnh mà các cuộc gọi một chức năng nhập và thực hiện các chuyển đổi cần thiết.

Trả lời

6

Không thể thực hiện được. Bạn có thể nhập các thủ tục được lưu trữ của bạn dưới dạng nhập khẩu hàm và thực hiện thủ công chúng nhưng bạn không thể thay thế các truy vấn được tạo bởi EF bằng các thủ tục được lưu trữ tùy chỉnh.

+0

Cảm ơn. Điều đó xác nhận những gì tôi nghi ngờ – Webbie4

2

Ngoại trừ việc bạn có thể, sắp xếp.

Thực hiện thủ tục được lưu trữ cơ bản nhất của bạn (ví dụ: thủ tục gần nhất với "chọn * từ mytable" và sử dụng nó để xác định chế độ xem trong cơ sở dữ liệu của bạn. Có khung thực thể sử dụng "myview" thay vì "mytable Sau đó, ánh xạ chèn của bạn, cập nhật và xóa các procs được lưu trữ cho thực thể dựa trên chế độ xem này như ban đầu bạn đã làm cho bảng của mình. Vì vậy, nếu bạn có một cái gì đó giống như một thực thể Person, và bạn đã có một proc được lưu trữ được gọi là FetchPersonByAge (int), thực thể của bạn sẽ kết thúc với một phương thức tĩnh được gọi là "GetByAge (int)". mã như thế này: var people33 = Person.getByAge (33);

Tôi đã làm điều này và nó hoạt động khá tốt, cho phép tôi tôn trọng nhà thiết kế của cơ sở dữ liệu kế thừa yêu cầu tất cả truy cập cơ sở dữ liệu phải được lưu trữ qua procs được lưu trữ của họ và không có mã người dùng nào truy cập trực tiếp vào bảng. Xem bài viết Julie Lerman của:

http://msdn.microsoft.com/en-us/data/gg699321.aspx

Dave

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