2009-06-21 38 views
6

Tôi có 3 bảng; Tôi viết một thủ tục lưu sẵn trong ADO.NET Entity Framework.Cách sử dụng thủ tục lưu sẵn trong ADO.NET Entity Framework

ALTER PROCEDURE [dbo].[sp_GetDepartmanData] 
(@departman nvarchar(50)) 
BEGIN 
    SELECT 
    d.ID, d.Name as DepartmanName, 
    sb.Salary, sb.email, 
    sp.Name, sp.SurName, sp.Phone, sp.Married, sp.Address 
    FROM   
    Departman d 
    INNER JOIN StaffsBusiness sb ON d.ID = sb.StaffsPersonelDepartmanID 
    INNER JOIN StaffsPersonel sp ON sb.StaffsPersonelID = sp.ID 
    WHERE 
    d.Name = @departman 
END 

Tôi cần một chức năng thủ tục lưu trữ tôi viết dưới đây:

var staffPersonel = staffContext.GetPersonelInformationWithDepartmanID("Yazılım"); 

gvPersonel.DataSource = staffPersonel; 
gvPersonel.DataBind(); 

GetPersonelInformationWithDepartmanID chức năng tôi viết từ SQL (hàm do người dùng định nghĩa trong ADO.NET Entity Framework) có 3 lựa chọn (nó là ngớ ngẩn !!!) nhưng tôi có 3 bàn joininig !!!. Làm thế nào tôi có thể sử dụng nếu tôi tham gia 3 bảng trước?

Trả lời

6

Okay, bạn cần một vài bước ở đây:

  • thêm thủ tục lưu trữ của bạn sp_GetDepartmanData để bạn mô hình Entity Framework (như là một sang một bên - nó là mạnh khuyên KHÔNG để gọi stored procedures bạn sp_(something) - sử dụng tiền tố sp_ được dành riêng cho quy trình lưu trữ hệ thống chỉ của Microsoft)
  • vì thủ tục được lưu trữ của bạn trả về một tập dữ liệu, trước tiên bạn cần tạo một thực thể khái niệm cho nó n sử dụng proc được lưu trữ của bạn; trong Trình thiết kế thực thể, tạo một thực thể mới và gọi nó là một số tên hữu ích như DepartmentDataEntityType hoặc một cái gì đó; thêm tất cả các trường được trả về từ quy trình đã lưu vào loại thực thể đó
  • bây giờ, bạn có thể tạo chức năng nhập của mình trong mô hình dữ liệu thực thể - chuyển đến trình duyệt mô hình, trong phần "model.store". và nhấp chuột phải vào "tạo chức năng nhập"
  • bây giờ bạn có thể cung cấp chức năng của mình trong tên đối tượng và xác định hàm trả về - trong trường hợp này, chọn loại thực thể mới được tạo của bạn (ví dụ: DepartmentDataEntityType từ trên)
  • bạn đã hoàn tất!

Bây giờ bạn sẽ có một cái gì đó chức năng nhập khẩu như:

public global::System.Data.Objects.ObjectResult<DepartmentDataEntityType> GetPersonelInformationWithDepartmanID(global::System.String departmentName) 
{ 
    global::System.Data.Objects.ObjectParameter departmentNameParameter; 

    departmentNameParameter = new global::System.Data.Objects.ObjectParameter("departmentNameParameter", departmentName); 

    return base.ExecuteFunction<DepartmentDataEntityType>("sp_GetDepartmanData", departmentNameParameter); 
} 

Chức năng này vào bối cảnh đối tượng của bạn bây giờ có thể được gọi để lấy dữ liệu thông qua các thủ tục lưu trữ từ cơ sở dữ liệu của bạn.

Marc

Edit:

Nếu bạn đang nhận được một lỗi lập bản đồ ("Lỗi 3027: Không có ánh xạ định cho những sản phẩm sau EntitySet/AssociationSet") sau khi thực hiện điều này, đó là vì các đơn vị bạn đã tạo không được ánh xạ tới bất kỳ thứ gì và chỉ được sử dụng khi chức năng nhập sẽ điền một tập hợp các thực thể này. Bạn cần phải ánh xạ thực thể này vào kho dữ liệu bằng cách nào đó hoặc bạn cần thay đổi nó thành một kiểu phức tạp.

Để tạo kiểu phức tạp, chỉ cần mở thiết kế EF và nhấp chuột phải vào vùng trống. Chuyển đến Thêm> Loại phức hợp. Bạn sẽ thấy một loại phức tạp mới xuất hiện trong trình duyệt mô hình. Nhấp chuột phải vào nó và thêm các thuộc tính vô hướng tương tự như cách bạn thêm thuộc tính vào thực thể của bạn. Sau đó xóa thực thể của bạn và đổi tên kiểu phức tạp của bạn giống như thực thể.

Đó là tất cả những gì bạn phải làm :)

+0

Hi Marc.. Tôi đã thử làm theo hướng dẫn của bạn, ở đây .. và tôi không thể làm cho nó hoạt động khi tôi có một thiết lập POCO.Nếu tôi cho phép các nhà thiết kế để tạo ra các lớp học của tôi, sau đó công trình này.Bạn có biết làm thế nào để làm điều này với POCO'S? –

+0

@ Pure.Krome: không, xin lỗi, tôi đã không thực sự làm bất cứ điều gì với EF4 POCO, vì vậy tôi có thể không thực sự nói .... –

+0

Điều này làm việc, nhưng tôi nhận được một lỗi liên tục trong danh sách lỗi s ays "Lỗi 3027: Không có ánh xạ được chỉ định cho EntitySet/AssociationSet sau". Tôi cần phải làm gì để giải quyết lỗi này? – Chev

1

Làm cách nào để bạn tạo "thực thể khái niệm" này? Nếu tôi tạo ra một thực thể mà không được ánh xạ đến tôi nhận được lỗi sau: "Entity type 'foobar' không được ánh xạ tới cơ sở dữ liệu

+0

Tôi cũng nhận được lỗi này ... từ những gì tôi có thể nói đó là lỗi 1.0 mà họ không định sửa cho đến khi 4.0 ra mắt vào tháng 3. https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=378518&wa=wsignin1.0 –

+0

Bummer :(Tôi đang sử dụng VS2010 và tôi vẫn gặp sự cố này .. mặc dù MS Connect cho biết lỗi là 'cố định'. WTF :(qq :( –

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