update stored framework first español code entity-framework stored-procedures visual-studio-2013 entity-framework-6 ef-database-first

entity framework - stored - Primera base de datos EF 6: ¿Cómo actualizar los procedimientos almacenados?



entity framework database first español (3)

¿Sus procedimientos almacenados devuelven datos de tablas temporales por casualidad? EF no parece apoyar esto, vea EF4 - El procedimiento almacenado seleccionado no devuelve columnas para más información.

Sin embargo, el procedimiento almacenado será, como ha observado, disponible en el navegador de modelos. Hice una prueba rápida con el escenario descrito anteriormente. El procedimiento almacenado se generó en mi clase de contexto, pero el tipo de devolución fue un int en lugar de un tipo complejo . Vea el enlace de arriba para soluciones potenciales.

Estamos utilizando Entity Framework 6.0.0 y usamos la base de datos primero (como esta) para generar código a partir de tablas y procedimientos almacenados. Esto parece funcionar muy bien, excepto que los cambios en los procedimientos almacenados no se reflejan al actualizar o actualizar el modelo. Agregar una columna a una tabla se refleja, pero no agrega un campo a un procedimiento almacenado.

Es interesante que si voy al Model Browser , hago clic con el botón derecho en el procedimiento almacenado, selecciono Add Function Import y Add Function Import clic en el botón Get Column Information , podemos ver las columnas correctas. Esto significa que el modelo conoce las columnas, pero no logra actualizar el código generado.

Existe una solución, que consiste en eliminar el procedimiento almacenado generado antes de actualizar el modelo. Esto funciona siempre que no haya realizado ninguna modificación en el procedimiento almacenado. ¿Alguien sabe de una manera de evitar esta solución?

Estoy usando Visual Studio 2013 con todas las actualizaciones más recientes a principios de diciembre de 2013.

¡Gracias por adelantado!

Actualización 1: la respuesta de andersr ayudó en un caso, donde el procedimiento almacenado usó una tabla temporal, por lo que le di +1, pero aún no resuelve el problema principal de actualizar procedimientos almacenados simples.

Actualización 2: el comentario de shimron a continuación contiene enlaces a una pregunta sobre los mismos problemas en EF 3.5. Parece que lo mismo sigue siendo cierto para EF 6.0. Léalo para una forma alternativa de hacerlo, pero mi conclusión a partir de ahora es que la forma más simple de hacerlo es eliminar el procedimiento almacenado generado antes de actualizar el modelo. Usa clases parciales si quieres hacer algo elegante.


Acabo de encontrar esto y mi solución (es realmente desagradable) fue crear una declaración if con una condición que nunca será cierta en la parte superior del procedimiento almacenado que selecciona la misma lista de resultados que la consulta con conversión explícita a los tipos de datos Quiero regresar. Esto asumirá la nulabilidad de tus tipos, por lo que para resolver que envuelves el elenco en un ISNULL

Por ejemplo, si su salida tiene las columnas:

UserId (int, not null) RoleId (int, nullable) FirstName (varchar(255), nullable) Created (datetime, not null)

Es de esperar que esto cree un POCO como:

SomeClass { public int UserId { get; set; } public int? RoleId { get; set; } public string FirstName { get; set; } public DateTime Created { get; set; } }

... Pero no es así y es por eso que estamos aquí hoy. Para evitar que esto funcione como esperaba, puse lo siguiente en la parte superior de mi SP (justo después del ''AS''):

if(1=0) begin select UserId = isnull((cast(0 as int)),0), RoleId = cast(0 as int), FirstName = cast(0 as varchar), DateTime = isnull((cast(0 as datetime)),'''') end

Es horrible y feo, pero funciona para mí todo el tiempo. Espero que obtengamos una actualización de herramientas que resuelva esto pronto ... me pasó hoy sin tablas temporales en SQL Server 2016 con VS2015 ...

Espero que esto ayude a alguien


En base a esta respuesta de DaveD , estos pasos abordan el problema:

  1. En su .edmx , haga clic y seleccione el Navegador de modelos .
  2. Dentro del Explorador de modelos (en la configuración predeterminada VS 2015, es una pestaña dentro del Explorador de soluciones), expanda Importaciones de funciones bajo el modelo.
  3. Haga doble clic en su procedimiento almacenado.
  4. Haga clic en el botón Actualizar al lado de Devuelve una colección de - Complejo (si no está devolviendo un escalar o entidad)
  5. Haga clic en Aceptar y luego guarde su .edmx para reflejar los cambios de campo en su procedimiento almacenado en todo su proyecto.