2009-04-26 31 views
9

He creado un procedimiento almacenado simple sin parámetros que he pegado a continuación. Importé el procedimiento almacenado en mi Modelo de Entidad y creé una Importación de Función. La función en el modelo nunca se crea y no puedo ejecutar este procedimiento almacenado utilizando ADO.NET Entity Framework. He abierto el archivo .edmx en la vista XML y he confirmado que no hay errores con respecto a este procedimiento almacenado. ¿Qué estoy haciendo mal? ¿Es realmente imposible llamar a un procedimiento almacenado tan simple desde el Entity Framework? Establecí el tipo de devolución para la función de importación en Ninguno viendo que este procedimiento almacenado no necesita devolver ningún conjunto de registros o valores.No se puede ejecutar el procedimiento almacenado con ADO.NET Entity Framework

procedimiento almacenado:

ALTER PROC [dbo].[Inventory_Snapshot_Create] 

AS 

SET NOCOUNT ON 

DECLARE @Inventory_Snapshot_ID int 

INSERT INTO Inventory_Snapshots (snapshot_timestamp) 
VALUES (GETDATE()) 

SET @Inventory_Snapshot_ID = SCOPE_IDENTITY() 

INSERT INTO Inventory_Snapshot_Products (inventory_snapshot_id, 
    idProduct, stock) 

    SELECT @Inventory_Snapshot_ID, idProduct, stock 
    FROM products 


SET NOCOUNT OFF 

Código intentar ejecutar procedimiento almacenado:

Dim db As New MilkModel 

db.Inventory_Snapshot_Create() 

Respuesta

6

Gracias, pmarflee.

De hecho, vine aquí para publicar mi resolución y vi su respuesta al mismo tiempo. Este código realmente usa la conexión de la estructura de la entidad y ejecuta el procedimiento almacenado que importé en el modelo. Microsoft sigue presionando a los desarrolladores para que utilicen Entity Framework en lugar de LINQ to SQL y otros generadores DAL, pero EF realmente no está donde debe estar. No lo usaré en proyectos futuros hasta que sea una solución más completa.

Esto es lo que terminé haciendo:

Dim db As New MilkModel 

'== 
'Begin dirty hack to execute parameterless/resultless stored 
'procedure using Entity Framework (well, sort of using EF). 
'http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/44a0a7c2-7c1b-43bc-98e0-4d072b94b2ab/ 
'== 
Dim con As DbConnection = db.Connection 

con.Open() 

Dim cmd As DbCommand = con.CreateCommand() 

With cmd 
    .CommandType = CommandType.StoredProcedure 
    .CommandText = "MilkModel.Inventory_Snapshot_Create" 
    .ExecuteNonQuery() 
    .Dispose() 
End With 

con.Dispose() 
'== 
'End dirty hack 
'== 
+0

Gracias por el trabajo, tampoco puedo creer que no pueda llamar a procedimientos almacenados. pero como dice pmarflee, el razonamiento es que si estás modificando las tablas en tu EF, entonces no debes usarlo. – greektreat

+2

No es necesario hackearlo, vea esto: http://msdn.microsoft.com/en-us/library/bb896231.aspx –

3

No creo que se puede agregar un procedimiento almacenado para un modelo de EF a menos que se asocia a una determinada Operación CRUD en una entidad. Sin embargo, puede hacer referencia a la propiedad Connection del objeto de contenedor de su entidad para acceder al objeto de conexión ADO.NET subyacente que está utilizando el EF. A continuación, puede llamar a su procedimiento almacenado utilizando el código ADO.NET tradicional.

+2

Eso realmente apesta. –

11

Primero agregarlo al modelo, entonces vas a la entidad contenedora, entonces la importación de la función.

Todos los detalles aquí:

http://msdn.microsoft.com/en-us/library/bb896231.aspx

+0

Esto es totalmente correcto. No hay necesidad de hacks desagradables aquí; solo necesitas leer los documentos. – Stuart

0

si quieren evitar el uso de un DbCommand, lo hice funciona haciendo que el SP volver algún conjunto de columnas que coinciden con una definición de la entidad.

4

Cualquier procedimiento almacenado se puede llamar a través de EF. Crea un SP y agrégalo a tu modelo. Vaya al explorador de modelos, haga clic con el botón secundario en la sp y haga clic en Agregar importación de función, aquí seleccione su SP y seleccione qué tipo devuelve; si no devuelve nada, seleccione 'Ninguno'. Si devuelve un tipo de sclar, seleccione el tipo, y si devuelve un conjunto de registros, seleccione complejo. Haga clic en obtener información de columna, le mostrará las columnas que regresan. haga clic en crear nuevo tipo complejo. y haga clic en Aceptar. Si devuelve una de las entidades, haga clic en la entidad de opción y seleccione el tipo de entidad en el cuadro de lista.

ahora usted lo llama en su código.

si su devolución de un complejo código de tipo de uso:

MyEntities _entities = new MyEntities(); var p = from d in _entities.GetOrderInfo() select d;

si es devolver nada, entonces use el código: MyEntities _entities = new MyEntities(); _entities.Cancel_Sale(ucode, oid);

Para otras preguntas visitar

http://dubeyniraj.blogspot.com/

+0

Si usa EF5 en adelante no hay importación de funciones, puede acceder a ellas directamente sin importación de funciones. – Niraj

1

En Si alguien más se pregunta sobre esto ...

El problema principal con los procesos almacenados y el Entity Framework es que los tipos de devolución deben definirse. Por ejemplo, si tiene un proceso almacenado que devuelve filas de soem de una tabla, se debe indicar a Entity Framework cómo es la estructura de esas filas. Necesita esto para poder generar todas las clases proxy y serializar y deserializar las cosas.

Cuando vaya a la función modelo - rigkt click - inport, puede elegir un proceso almacenado, pero espera que los tipos de retorno sean ninguno, escalar o de entidad (ee basado en las tablas de su base de datos) . Si lo desea, puede agregar un tipo complejo. Haga clic derecho en el modelo - elija agregar - Tipo complejo. A continuación, define las columnas y sus tipos de datos.

Una vez hecho esto, la clase que acaba de crear aparecerá en la lista de tipos de entidad mencionados anteriormente.

1

Para mi proyecto, en realidad estoy usando un FirebirdSql DB, no sé si es realmente correcto para Entity Framework, ya que lo uso me da algunos problemas y no es tan eficiente.

Pero de todos modos si yo (función) importa un procedimiento almacenado con algunas operaciones de inserción dentro, por alguna razón no pasa nada. En otras palabras, si añado a mi modelo (EDCX) tales SP:

create procedure insert_stuff(thing varchar(40)) 
returns response(50) 
as 
begin 
    insert into stuffs(thing) values (thing); 

    response = 'done!'; 

    suspend; 
end; 

y luego lo llamo de esta manera:

FirebirdContext.InsertStuff("Hi there!"); // it should return an ObjectResult<String> 
FirebirdContext.SaveChanges(); 

así que realmente sucede nada. Nada en absoluto. Ni excepciones ni resultados ni insertos, todo es perfecto, sin advertencias, sin errores de compilación. Lo curioso es que si pongo una eliminación en el script de procedimiento almacenado, ¡la eliminación funciona! ¡Pero sin inserciones!

La tabla es muy simple como se muestra y ya importé otros procedimientos almacenados y funcionan, pero debido a que contienen consultas, actualizaciones y eliminación, en el caso de que obtuvieran insert ... ¡de ninguna manera! ¿Podría ser un error en el proveedor Firebird Ado.NET? ¿O tengo que configurar algo que me he perdido?

Cuestiones relacionadas