Eu sou muito novo no Entity Framework 6 e quero implementar procedimentos armazenados no meu projeto. Eu tenho um procedimento armazenado da seguinte maneira:
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
classe:
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
}
Meu problema é: como posso chamar o procedimento armazenado e passar parâmetros para ele?
Respostas:
Você pode chamar um procedimento armazenado em sua
DbContext
classe da seguinte maneira.Mas se o procedimento armazenado retornar vários conjuntos de resultados como seu código de exemplo, você poderá ver este artigo útil no MSDN
Procedimentos armazenados com vários conjuntos de resultados
fonte
"storedProcedureName @param1, @param2"
. Também o tipo deparams
éSystem.Data.SqlClient.SqlParameter[]
.this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Tudo que você precisa fazer é criar um objeto que tenha os mesmos nomes de propriedades que os resultados retornados pelo procedimento armazenado. Para o seguinte procedimento armazenado:
crie uma classe parecida com:
e chame o procedimento da seguinte maneira:
O resultado conterá uma lista de
ResultForCampaign
objetos. Você pode ligarSqlQuery
usando quantos parâmetros forem necessários.fonte
Eu resolvi com
ExecuteSqlCommand
Coloque seu próprio método como o meu no DbContext como suas próprias instâncias:
para que você possa ter um método no seu code-behind assim:
este é o meu SP:
a esperança ajudou você
fonte
Usando seu exemplo, aqui estão duas maneiras de fazer isso:
1 - Use o mapeamento de procedimento armazenado
Observe que esse código funcionará com ou sem mapeamento. Se você desativar o mapeamento na entidade, o EF gerará uma instrução insert + select.
2 - Ligue diretamente para o procedimento armazenado
Eu recomendo usar a primeira abordagem, pois você pode trabalhar diretamente com o objeto de departamento e não precisa criar um monte de objetos SqlParameter.
fonte
Você está usando o
MapToStoredProcedures()
que indica que está mapeando suas entidades para procedimentos armazenados. Ao fazer isso, é necessário deixar de lado o fato de que existe um procedimento armazenado e usá-locontext
normalmente. Algo assim ( escrito no navegador, portanto não testado )Se tudo o que você realmente está tentando fazer é chamar diretamente um procedimento armazenado, use
SqlQuery
fonte
.MapToStoredProcedures(s =>
. Uma chamada paraAdd
deve resolver para.Insert(i => i.HasName("insert_department")
Agora você também pode usar uma convenção que eu criei que permite chamar procedimentos armazenados (incluindo procedimentos armazenados retornando vários conjuntos de resultados), TVFs e UDFs escalares nativamente do EF.
Consulte Mais informação
Leia mais .
fonte
fonte
Isso funciona para mim, retirando dados de um procedimento armazenado ao passar um parâmetro.
_db
é o dbContextfonte
Dê uma olhada neste link que mostra como funciona o mapeamento do EF 6 com procedimentos armazenados para fazer uma inserção, atualização e exclusão: http://msdn.microsoft.com/en-us/data/dn468673
Adição
Aqui está um ótimo exemplo para chamar um procedimento armazenado do Code First:
Digamos que você precise executar um Procedimento armazenado com um único parâmetro e que o Procedimento armazenado retorne um conjunto de dados que corresponda aos Estados da entidade, portanto, teremos isso:
Agora, digamos que desejamos executar outro procedimento armazenado com dois parâmetros:
Observe que estamos usando a nomeação baseada em índice para parâmetros. Isso ocorre porque o Entity Framework agrupa esses parâmetros como objetos DbParameter para evitar problemas de injeção de SQL.
Espero que este exemplo ajude!
fonte
fonte
Funciona para mim primeiro no código. Ele retorna uma lista com propriedades correspondentes do modelo de exibição (StudentChapterCompletionViewModel)
Atualizado para o contexto
Contexto é a instância da classe que Inherit DbContext como abaixo.
fonte
O passageiro irracional tem um projeto que permite que vários conjuntos de resultados sejam retornados de um processo armazenado usando a estrutura da entidade. Um de seus exemplos abaixo ....
fonte
Você pode passar parâmetros para
sp_GetById
e buscar os resultados emToList()
ouFirstOrDefault();
fonte
se você quiser passar parâmetros de tabela para o procedimento armazenado, defina a propriedade TypeName necessária para seus parâmetros de tabela.
fonte
Isto é o que o EF (DB primeiro) gera na classe DbContext:
fonte
Quando o EDMX criar esse tempo, se você selecionar a opção de procedimento armazenado na tabela, basta chamar o armazenamento processado usando o nome do procedimento ...
fonte
Descobri que a chamada de procedimentos armazenados na abordagem Code First não é conveniente. Eu prefiro usar
Dapper
vezO seguinte código foi escrito com
Entity Framework
:O seguinte código foi escrito com
Dapper
:Eu acredito que o segundo pedaço de código é mais simples de entender.
fonte
fonte
Nada precisa fazer ... quando você estiver criando o dbcontext para a primeira abordagem de código, inicialize o namespace abaixo da área da API fluente, faça uma lista de sp e use-a em outro local onde desejar.
}
fonte
Usando primeiro o código de estrutura MySql e Entity
fonte
Criar procedimento no MYsql.
Criar classe que contém valores do conjunto de resultados de retorno do procedimento armazenado
Adicionar classe no Dbcontext
Chamar entidade no repositório
fonte