EF 6 database first: How to update stored procedures?

37,373

Solution 1

Based on this answer by DaveD, these steps address the issue:

  1. In your .edmx, rt-click and select Model Browser.
  2. Within the Model Browser (in VS 2015 default configuration, it is a tab within the Solution Explorer), expand Function Imports under the model.
  3. Double-click your stored procedure.
  4. Click the Update button next to Returns a Collection Of - Complex (if not returning a scalar or entity)
  5. Click okay then save your .edmx to reflect field changes to your stored procedure throughout your project.

Solution 2

Does your stored procedures return data from temporary tables by any chance ? EF does not seem to support this, see EF4 - The selected stored procedure returns no columns for more information.

However, the stored procedure will as you observed, be available in the Model Browser. I did a quick test featuring the scenario described above. The stored procedure was generated in my context class, but the return type was an int rather than a complex type. See the link above for potential workarounds.

Share:
37,373

Related videos on Youtube

Halvard
Author by

Halvard

I'm a socialist and I feel fine. Work all day and sleep all night. My hobby apps: Word game inspired by Wordle (free): https://guessthequote.azurewebsites.net/ Psychology/philosophy educational quiz (free): https://ikwyt3.azurewebsites.net

Updated on August 13, 2020

Comments

  • Halvard
    Halvard over 3 years

    We are using Entity Framework 6.0.0 and use database first (like this) to generate code from tables and stored procedures. This seems to work great, except that changes in stored procedures are not reflected when updating or refreshing the model. Adding a column to a table is reflected, but not adding a field to a stored procedure.

    It is interesting that if I go to the Model Browser, right click the stored procedure, select Add Function Import and click the button Get Column Information we can see the correct columns. This means that the model knows of the columns, but does not manage to update the generated code.

    There is one workaround, and that is to delete the generated stored procedure before updating the model. This works as long as you have not made any edits on the stored procedure. Does anyone know of a way to avoid this workaround?

    I am using Visual Studio 2013 with all the latest updates as of early December 2013.

    Thanks in advance!

    Update 1: andersr's answer helped in one case, where the stored procedure used a temporary table, so i gave him +1, but it still does not solve the main problem of updating simple stored procedures.

    Update 2: shimron's comment below links to a question about the same issues in EF 3.5. It seems the same is still true for EF 6.0. Read it for an alternative way of doing it, but my conclusion as of now is that the simplest way of doing it is to delete the generated stored procedure before updating the model. Use partial classes if you want to do something fancy.

  • Halvard
    Halvard over 10 years
    +1 because this helped with a stored procedure using a temporary table, but it did not really solve the main question (see my update above). Thanks anyway!
  • Andrew
    Andrew about 7 years
    Isn't it better to delete and then re-add the SP?
  • How 'bout a Fresca
    How 'bout a Fresca about 7 years
    Yes, worlds better - but unfortunately deleting and re-adding the SP gave me the same bizarre result
  • Andrew
    Andrew about 7 years
    I think if you open the Model Browser, delete the SP, the complex type and the function import, close and reopen the solution and add the SP, it has to work!
  • markmnl
    markmnl almost 7 years
    This updates the complex type generated for the return value. Any idea how to update the parameters of the stored procedure in you model after updating the database?
  • markmnl
    markmnl almost 7 years
    To answer my own question refreshing the entire model works using the Update Model from Database... wizard.
  • Jeremy
    Jeremy almost 7 years
    Yes you need to delete all 3 artifacts: sp, complex type and function import for it to work
  • Wouter Vanherck
    Wouter Vanherck almost 6 years
    What if you don't have a .edmx file?
  • Arthur Yegiazaryan
    Arthur Yegiazaryan about 5 years
    Just an FYI this approach, while valid in all versions of Visual Studio 2017, this approach does not work in Visual Studio 2019 version 16.0.0