Soy muy nuevo en Entity Framework 6 y quiero implementar procedimientos almacenados en mi proyecto. Tengo un procedimiento almacenado de la siguiente manera:
ALTER PROCEDURE [dbo].[insert_department]
@Name [varchar](100)
AS
BEGIN
INSERT [dbo].[Departments]([Name])
VALUES (@Name)
DECLARE @DeptId int
SELECT @DeptId = [DeptId]
FROM [dbo].[Departments]
WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()
SELECT t0.[DeptId]
FROM [dbo].[Departments] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END
Department
clase:
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
}
modelBuilder
.Entity<Department>()
.MapToStoredProcedures(s =>
s.Update(u => u.HasName("modify_department")
.Parameter(b => b.Department, "department_id")
.Parameter(b => b.Name, "department_name"))
.Delete(d => d.HasName("delete_department")
.Parameter(b => b.DepartmentId, "department_id"))
.Insert(i => i.HasName("insert_department")
.Parameter(b => b.Name, "department_name")));
protected void btnSave_Click(object sender, EventArgs e)
{
string department = txtDepartment.text.trim();
// here I want to call the stored procedure to insert values
}
Mi problema es: ¿cómo puedo llamar al procedimiento almacenado y pasarle parámetros?
Respuestas:
Puede llamar a un procedimiento almacenado en su
DbContext
clase de la siguiente manera.Pero si su procedimiento almacenado devuelve múltiples conjuntos de resultados como su código de muestra, puede ver este útil artículo en MSDN
Procedimientos almacenados con conjuntos de resultados múltiples
fuente
"storedProcedureName @param1, @param2"
. También el tipo deparams
esSystem.Data.SqlClient.SqlParameter[]
.this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Todo lo que tiene que hacer es crear un objeto que tenga los mismos nombres de propiedad que los resultados devueltos por el procedimiento almacenado. Para el siguiente procedimiento almacenado:
crear una clase que se vea así:
y luego llame al procedimiento haciendo lo siguiente:
El resultado contendrá una lista de
ResultForCampaign
objetos. Puede llamarSqlQuery
utilizando tantos parámetros como sea necesario.fuente
Lo resolví con
ExecuteSqlCommand
Pon tu propio método como el mío en DbContext como tus propias instancias:
para que pueda tener un método en su código subyacente como este:
este es mi SP:
la esperanza te ayudó
fuente
Usando su ejemplo, aquí hay dos formas de lograr esto:
1 - Usar mapeo de procedimiento almacenado
Tenga en cuenta que este código funcionará con o sin mapeo. Si desactiva la asignación en la entidad, EF generará una instrucción de inserción + selección.
2 - Llamar directamente al procedimiento almacenado
Recomiendo usar el primer enfoque, ya que puede trabajar con el objeto de departamento directamente y no tener que crear un montón de objetos SqlParameter.
fuente
Está utilizando lo
MapToStoredProcedures()
que indica que está asignando sus entidades a procedimientos almacenados, al hacer esto debe dejar de lado el hecho de que hay un procedimiento almacenado y usar el decontext
forma normal. Algo como esto ( escrito en el navegador para que no se pruebe )Si todo lo que realmente intenta hacer es llamar directamente a un procedimiento almacenado, entonces use
SqlQuery
fuente
.MapToStoredProcedures(s =>
. Una llamada aAdd
debe resolverse a.Insert(i => i.HasName("insert_department")
Ahora también puede usar una convención que creé que permite invocar procedimientos almacenados (incluidos los procedimientos almacenados que devuelven múltiples conjuntos de resultados), TVF y UDF escalares de forma nativa desde EF.
Lee mas
Leer más .
fuente
fuente
Esto funciona para mí retirando datos de un procedimiento almacenado mientras pasa un parámetro.
_db
es el dbContextfuente
Eche un vistazo a este enlace que muestra cómo funciona la asignación de EF 6 con procedimientos almacenados para realizar una inserción, actualización y eliminación: http://msdn.microsoft.com/en-us/data/dn468673
Adición
Aquí hay un gran ejemplo para llamar a un procedimiento almacenado desde Code First:
Digamos que tiene que ejecutar un Procedimiento almacenado con un solo parámetro, y que el Procedimiento almacenado devuelve un conjunto de datos que coinciden con los Estados de entidad, por lo que tendremos esto:
Ahora digamos que queremos ejecutar otro procedimiento almacenado con dos parámetros:
Observe que estamos usando nombres basados en índices para los parámetros. Esto se debe a que Entity Framework envolverá estos parámetros como objetos DbParameter para evitar cualquier problema de inyección SQL.
Espero que este ejemplo ayude!
fuente
fuente
Funciona para mí al código primero. Devuelve una lista con la propiedad coincidente del modelo de vista (StudentChapterCompletionViewModel)
Actualizado para contexto
El contexto es la instancia de la clase que hereda DbContext como a continuación.
fuente
El pasajero sin sentido tiene un proyecto que permite que se devuelvan conjuntos de resultados múltiples desde un proceso almacenado utilizando el marco de la entidad. Uno de sus ejemplos a continuación ...
fuente
Puede pasar parámetros
sp_GetById
y obtener los resultados enToList()
oFirstOrDefault();
fuente
si desea pasar parámetros de tabla al procedimiento almacenado, debe establecer necesariamente la propiedad TypeName para sus parámetros de tabla.
fuente
Esto es lo que EF (DB primero) genera en la clase DbContext:
fuente
Cuando EDMX cree este tiempo si selecciona almacenado procesado en la opción de selección de tabla, simplemente llame a la tienda procesada usando el nombre del procedimiento ...
fuente
Encontré que llamar a procedimientos almacenados en el enfoque de Code First no es conveniente. Prefiero usar
Dapper
en su lugarEl siguiente código fue escrito con
Entity Framework
:El siguiente código fue escrito con
Dapper
:Creo que la segunda parte del código es más simple de entender.
fuente
fuente
Nada tiene que hacer ... cuando está creando dbcontext para el primer enfoque de código, inicialice el espacio de nombres debajo del área API fluida, haga una lista de sp y úsela en otro lugar donde desee.
}
fuente
Usando MySql y Entity Framework Code primer enfoque:
fuente
Crear procedimiento en MYsql.
Crear clase que contiene valores de conjunto de resultados de retorno de procedimientos almacenados
Agregar clase en Dbcontext
Entidad de llamada en repositorio
fuente