2011-07-14 24 views
9

Vì vậy, tôi đã có một DB trong SQL Server mà tôi đang kết nối và sử dụng Entity Framework 4.1 để tạo các lớp POCO của tôi, hoạt động khá tốt. Ngoài ra còn có các thủ tục được lưu trữ mà tôi đang sử dụng tính năng 'nhập khẩu chức năng' để tạo ra các hàng kết quả của dữ liệu từ gọi chúng. Về cơ bản quá trình tôi đang sử dụng là:Phản ánh các thay đổi được thực hiện cho thủ tục lưu sẵn trong Entity Framework-complex type

  1. Nhấp chuột phải vào các Model.edmx và chọn "Chức năng Import ..."
  2. Chọn các thủ tục từ menu thả xuống
  3. Nhập mong muốn nhập khẩu Chức năng của tôi Đặt tên cho
  4. Bấm "Nhận thông tin Cột"
  5. Nhấp vào "Tạo Kiểu Complex mới"
  6. Nhấp "OK"
.210

và điều đó sẽ tạo ra một lớp POCO cho định nghĩa tập hợp kết quả và tôi có thể làm điều gì đó như:

var query = context.GetMyStuff().AsQueryable();

để lấy kết quả. Điều này dường như làm việc tốt.

Bây giờ sự cố tôi gặp phải là khi tôi cố gắng sửa đổi quy trình được lưu trữ và sau đó nhận các thay đổi để truyền cho mã của tôi. Ví dụ, tôi đã thêm một cột bổ sung vào một bảng và sau đó cập nhật thủ tục đã lưu trữ để trả về dữ liệu cột đó như là một phần của kết quả. Tôi không thấy cách làm cho bản cập nhật đó lan truyền vào công cụ nhập hàm, tức là, hãy nhận POCO được tạo để có thuộc tính mới cho cột được thêm vào đó.

Mũi khoan để thực hiện cập nhật đó cho quy trình phản ánh lại ở mặt C# là gì? Tôi sẽ phải thực hiện một lớp học mới mỗi lần? Không rõ ràng đối với tôi làm thế nào để làm điều này.


Thông tin bổ sung:

Khi tôi đã cố gắng để "Update" kiểu Complex, như đề xuất trong việc ứng phó bằng cách Ladislav để this question, tôi nhận được một thông báo lỗi "Xác minh rằng tên FunctionImport là duy nhất . "

Nếu tôi thử những gì E.J. Brennan gợi ý dưới đây, tôi nhận được thông báo lỗi tương tự.

Điều gì hiện hoạt động, ít nhất là với tôi, là mở tệp Model.edmx trong Notepad ++, tìm dòng FunctionImport và xóa nó rồi tạo lại nó. Đó không phải là lý tưởng, nhưng nó hoạt động.

+0

Tôi không chắc chắn nếu đây là cùng một câu hỏi: http://stackoverflow.com/questions/6381423/function-import-when-sp-is-changed –

+0

@Ladislav - thấy điều đó, nhưng khi tôi cố gắng làm điều đó tôi nhận được một lỗi. Tôi sẽ chỉnh sửa câu hỏi của mình ở trên để phản ánh điều đó. – itsmatt

Trả lời

9

Tôi thường truy cập trình duyệt mô hình, Trong menu chính, chọn Xem> Windows khác> Trình duyệt mô hình dữ liệu thực thể (thường mở trong cùng bảng điều khiển với Trình khám phá giải pháp) và xóa thủ tục đã lưu đã thay đổi và thêm nó trở lại.

Có thể dễ dàng hơn, nhưng điều này phù hợp với tôi.

Chỉnh sửa: "Cập nhật mô hình từ cơ sở dữ liệu" về lý thuyết cũng nên hoạt động, nhưng theo kinh nghiệm của tôi, nó không hoạt động 100% thời gian, xóa và thêm lại có vẻ như đá chắc chắn.

+0

Cảm ơn bạn đã phản hồi - đã thử điều này nhưng có cùng sự cố như tôi đã lưu ý thêm vào cuối câu hỏi của mình. Nếu tôi chỉnh sửa các tập tin .edmx trực tiếp (xml, đó là) và xóa một trong những tôi đang cố gắng để cập nhật (dòng FunctionImport), nó hoạt động nhưng điều này có vẻ hơi clunky. – itsmatt

+0

Khi bạn ở trong trình duyệt mô hình, bạn có xóa thủ tục đã lưu và xóa chức năng nhập - hai lần xóa riêng biệt không? Điều đó làm việc cho tôi mà không có lỗi - chỉ cần xác nhận nó. –

+0

Tôi đã xóa chức năng nhập, sau đó xóa proc đã lưu trữ, sau đó thực hiện cập nhật từ db đã đưa trở lại trong proc đã lưu bị xóa. Đã làm một nhấp chuột phải vào mô hình.edmx, Function Import, nhập lại Function Import Name mong muốn của tôi, chọn proc được lưu trữ từ danh sách thả xuống, nhấp nút get columns, nhấp vào 'Create New Complex Type', cái tên đã cho tôi một tên kiểu phức tạp của MyFuncImportName_Result, nhấn OK và nhận "Xác minh rằng tên FunctionImport là duy nhất." hộp thoại. Xuất hiện rằng model.edmx vẫn có một mục trong đó - nếu tôi xóa nó theo cách thủ công từ xml, nó sẽ hoạt động. – itsmatt

1

@itsmatt - giải pháp của bạn đã hiệu quả đối với tôi.Tóm lại,

  1. Mở tệp .edmx trong trình chỉnh sửa văn bản.
  2. Xác định vị trí và xóa các nút XML trông giống như:
<FunctionImport Name="<some name>" ReturnType="Collection(dev_riskModel.GetECLExcesses_Result)"> 
(additional lines. . .) 
</FunctionImport> 
  1. Lưu file
  2. Trong trình duyệt mô hình, cập nhật các mô hình từ cơ sở dữ liệu, bạn thêm lại được lưu trữ proc
  3. Chọn proc mới được lưu trữ, sau đó chọn mục "Thêm chức năng nhập" từ menu ngữ cảnh, v.v.
1

Tôi vừa đối mặt với cùng một vấn đề này và cảm ơn bạn đã trả lời! Một điều nữa tôi phải làm là xóa đầu ra khỏi "Loại phức tạp" trong trình duyệt mô hình.

+0

Đó phải là một bình luận chứ không phải là một câu trả lời. Tôi biết bạn cần thêm một số đại diện để bình luận. – bummi

26

(Giải pháp này là dành cho EF 6. Tôi đã không cố gắng trong các phiên bản EF khác. Nó hoạt động tốt đẹp.) Tôi đang hỗ trợ câu trả lời Brennan bằng cách minh họa một ví dụ để làm cho nó rõ ràng hơn đối với lập trình viên ngây thơ như tôi :)


Đi tới Trình duyệt mô hình. MyStoreProc là tên của thủ tục được lưu trữ (làm ví dụ). MyStoreProc sẽ xuất hiện ở 3 nơi.

  1. địa điểm- 1st Dưới Complex Types-> như MyStoreProc_result
  2. 2 địa điểm- Dưới Nhập khẩu Chức năng -> như MyStoreProc
  3. 3rd Place - Dưới Stored Procdures/Chức năng -> như MyStoreProc enter image description here

Xóa tất cả ba từ mô hình. Lưu edmx (bằng cách nhấp vào trong cửa sổ rồi nhấn ctrl + S). Sau đó, nhấp chuột phải và nhấp vào cập nhật mô hình từ cơ sở dữ liệu. Sau đó, thêm thủ tục được lưu trữ được cập nhật và Lưu lại.

giải quyết mà không có rắc rối nào :)

2

Tại công ty chúng tôi, chúng tôi sử dụng để cập nhật của SP như SArifin câu trả lời ... mà hoạt động nhưng là loại kéo.

Gần đây chúng tôi phát hiện ra rằng bạn chỉ cần truy cập vào Chức năng SP đó -> Nhấp chuột phải -> Chỉnh sửa -> Cập nhật loại phức tạp.

+0

Cảm ơn điều này, tôi sử dụng để xóa 3 trường hợp riêng biệt của mỗi SP (loại phức tạp) nhưng đề xuất của bạn hoạt động và nhanh hơn rất nhiều ... – NickGPS

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