2010-09-29 40 views
5

Tôi đang sử dụng Entity Framework 4 với trình tạo mã POCO. Tôi có một thủ tục lưu trữ thực hiện một INSERT và trả về @@ IDENTITY của bản ghi được chèn vào. Tôi đang cố gắng để nhập khẩu các thủ tục được lưu trữ như là một chức năng trong tập tin .edmx của tôi, nhưng tôi gặp khó khăn khi sử dụng nó.Entity Framework 4 Chức năng Nhập khẩu không hoạt động

Trong trình duyệt mô hình, tôi có thể xem thủ tục được lưu trữ theo cơ sở dữ liệu heirarchy, và sau đó tôi nhấp chuột phải và chọn "Chức năng nhập ..." Tôi đã thử sử dụng "Không" làm kiểu trả về cũng như Int32 (mặc dù nó nói "Bộ sưu tập của .."). Hàm này xuất hiện dưới Chức năng Nhập khẩu, nhưng ngay cả sau khi lưu và biên dịch, tôi không thể tìm thấy hàm này ở bất kỳ đâu trong ObjectContext của tôi. Tôi đã cố gắng xóa nó và nhập lại các thủ tục được lưu trữ nhiều lần mà không thành công.

LƯU Ý: Tôi có một thủ tục được lưu trữ khác thực hiện lệnh SELECT thẳng và điều này được nhập đúng và hiển thị trong mã ObjectContext.

Tôi có làm gì sai không?

Trả lời

5

Nếu thủ tục lưu trữ của bạn không trả về tập kết quả, do đó bạn chọn "Trả về bộ sưu tập" "Không" trong hộp thoại "Thêm chức năng nhập" trong Visual Studio, khi đó hàm nhập không được thêm làm phương thức ngữ cảnh đối tượng được tạo của bạn. (Tôi chưa thể tìm ra lý do tại sao, nhưng tôi vẫn đang tìm kiếm.)

Giá trị trả lại từ sproc (ví dụ: return @@ identity) không phải là ý nghĩa của "Trả về một bộ sưu tập "câu hỏi. Đó là lý do tại sao nó không hoạt động. Câu hỏi đặt ra là hỏi về bộ kết quả nào được trả về từ sproc.

Có ba cách tôi có thể nghĩ ra để xử lý vấn đề của bạn:

  1. Return giá trị danh tính của bạn bằng cách sử dụng lựa chọn (ví dụ, chọn @@ sắc như Identity) và sau đó xác định một tập hợp các Int32 trong bài trả lời đến câu trả lời "Trả về bộ sưu tập".

  2. Return giá trị danh tính của bạn sử dụng một khoản đầu ra trên tuyên bố chèn của bạn và làm cho nó theo cùng một cách như trong 1.

  3. Sử dụng Entity SQL và làm cho giá trị bản sắc một tham số ra. Dưới đây là cách thực hiện: How to: Execute a Query Using a Stored Procedure with In and Out Parameters

Tôi hy vọng điều đó sẽ hữu ích.

5

Mở điều tra của tập tin POCO .Context.tt tôi thấy đoạn mã sau vào khoảng dòng 111

if (edmFunction.ReturnParameter == null) 
{ 
    continue; 
} 
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 

có nghĩa là bất kỳ chức năng nhập khẩu mà trở về 'không' sẽ không được viết.

tôi đã sửa đổi tập tin .Context.tt tôi để đoạn mã trên được thay thế bằng

string returnTypeElement = @""; 
if (edmFunction.ReturnParameter == null) 
{ 
    returnTypeElement = @"void"; 
} else { 
    returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 
} 

Tôi đã sau đó đã có thêm một số kiểm tra xung quanh khai báo hàm (khoảng dòng 118)

<# 
    if(returnTypeElement != "void"){ 
#> 
    <#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>) 
<# 
    } else { 
#> 
    <#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeElement#> <#=code.Escape(edmFunction)#>(<#=paramList#>) 
<# 
    } 
#> 

và câu trả lại (khoảng dòng 142)

<# 
    if(returnTypeElement != "void"){ 
#> 
     return base.ExecuteFunction<<#=returnTypeElement#>>("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
<# 
    } else { 
#> 
     base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
<# 
    } 
#> 

Bây giờ, điều này có thể Nó không có nghĩa là tôi có thể sử dụng chức năng nhập khẩu trên các thủ tục lưu trữ của tôi mà không trả lại bất cứ điều gì và có các chức năng tương ứng được tạo ra trong tập tin .Context.cs, và do đó có thể truy cập thông qua Intellisense.

+0

Được làm tốt - hoạt động tốt! – BrianCooksey

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