Reflecting changes made to stored procedure in Entity Framework-generated complex type
So I've got a DB in SQL Server that I'm connecting to and using Entity Framework 4.1 to generate my POCO classes, which works generally pretty well. There are also stored procedures that I am using the 'function import' feature to create retrieve the resulting rows of data from calling them. Essentially the process I'm using is to:
- Right-click on the Model.edmx and choose "Function Import..."
- Pick the procedure from the dropdown
- Enter my desired Function Import Name
- Click "Get Column Information"
- Click "Create New Complex Type"
- Click "OK"
and that will create a POCO class for the result set definition and I can do something like:
var query = context.GetMyStuff().AsQueryable();
to retrieve the results. This seems to work just fine.
Now the trouble I'm having is when I try to modify a stored procedure and then get the changes to propagate to my code. For instance, I added an additional column to a table and then updated the stored procedure to return that column data as part of the results. I don't see how to make that update propagate into the function import stuff, i.e., get the generated POCO to have a new property for that added column.
What's the drill to make that update to the procedure reflect back in C# side? Am I going to have to make a new class each time? Wasn't obvious to me how to do this.
Additional Info:
When I've tried to "Update" the Complex type, as suggested in the response by Ladislav to this question, I get an error message "Verify that the FunctionImp开发者_开发知识库ort name is unique."
If I try what E.J. Brennan suggests below, I get the same error message.
What does work, at least for me, is to open the Model.edmx file in Notepad++, find the FunctionImport line and delete it then regenerate it. That's not ideal, but it worked.
(This solution is for EF 6. I have not tried in other EF versions. It works nice.) I am supporting Brennan's answer by illustrating an example to make it more clear to naive coders like me :)
Go to Model browser. MyStoreProc is the name of the stored procedure (as an example). MyStoreProc will appear in 3 places.
- 1st place- Under Complex Types-> as MyStoreProc_result
- 2nd Place- Under Function Imports -> as MyStoreProc
- 3rd Place - Under Stored Procdures/ Functions -> as MyStoreProc
Delete all three from model. Save the edmx (by clicking in the window then ctrl+S). Then right click and click update the model from database. Then add the updated stored procedure and Save again.
Solved without any hassle :)
I usually go into the model browser, In main menu select View > Other Windows > Entity Data Model Browser (it usually opens in the same panel as Solution explorer), and delete the stored procedure that has changed, and re-add it back in.
There may be an easier, but this one works for me.
Edit: "Update model from database" theoretically should also work, but in my experience, it doesn't work 100% of the time, deleting and re-adding seems rock solid.
At our company we used to update the SP's like SArifin answer...which works but is kind of a drag.
Recently we found out that you only have to go to that SP Function Import -> Right Click -> Edit -> Update the complex type.
@itsmatt - your solution worked for me. In short,
- Open file .edmx in a text editor.
- Locate and delete the XML node that looks like:
<FunctionImport Name="<some name>" ReturnType="Collection(dev_riskModel.GetECLExcesses_Result)"> (additional lines. . .) </FunctionImport>
- Save the file
- In the model browser, update the model from the database, re-adding the stored proc
- Select the newly added stored proc, then select the "Add Function Import" item from the context menu, etc.
I just faced this same issue and thank you for your answer! One more thing I had to do was to delete the output from the "Complex Types" in the model browser.
精彩评论