none
Ajuda com Entity Framework Complex Types RRS feed

  • Pergunta

  • é o seguinte , aonde trabalho, temos centenas de store procedures.

    Diversas dessas sp, são complexas ,algumas contém mais de 500 linhas consultando ou alterando mais de 30 tabelas  ao mesmo tempo

    No momento estou trabalhando com uma delas, e o meu cenário é o seguinte:

    Estou em um projeto MVC 5 utilizando entity framework 6 com abordagem DbFirst, 

    Essa stored procedure, faz consulta em diversas tabelas para trazer dados financeiros e outras informações, e o nosso dba aqui disse que ficaria inviável mapearmos para o entity todas as tabelas as quais essa stored procedure utiliza.

    O que eu preciso é saber se com o entity frmework eu consigo utilizar essa stored procedure sem precisar mapear todas as tabelas envolvidas na select da sp.

    No momento o que fiz foi mapear a procedure, criar uma classe para ela com os parâmetros que ela recebe, e uma ViewModel com propriedades para representar os dados que a sp retorna, mas até o momento não pude testar esse cenário ainda.

    ps: E o problema é que terei de utilizar essas procedures em outras várias situações. Por isso é importante saber se isso é possível.

    domingo, 23 de março de 2014 17:29

Respostas

  • Sim, concerteza ....

    Aqui vou dar um exemplo de StoredProcedure e o código referente para adicionar em um DbContext (ENTITY)...

    Esse seria as tabelas da Stored Procedure logo abaixo que irá buscar pelo PessoaId alguns dados

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE sp_ListPessoasComTelefones
    	@PessoaId int
    AS
    BEGIN	
    	SET NOCOUNT ON;	
    	BEGIN			
    		SELECT Pessoa.PessoaId, 
    				Pessoa.Nome, 
    				Telefone.TelefoneId,  
    				Telefone.Ddd, 
    				Telefone.Numero
    		FROM Pessoa LEFT JOIN
    				Telefone ON Pessoa.PessoaId = Telefone.PessoaId
    		WHERE Pessoa.PessoaId = @PessoaId
    		ORDER BY Pessoa.Nome, Pessoa.PessoaId
    	END
    END
    GO

    Essa SP trará os telefones pelo Código da Pessoa (PessoaId) 

    Entity 6

    using System;
    namespace ConsoleAppEntitySProcedure.Model
    {
        public partial class ContextoSP: System.Data.Entity.DbContext
        {
            public ContextoSP()
                :base("Data Source=.\\sqlexpress;Initial Catalog=cbo;Persist Security Info=True;User ID=sa;Password=senha")
            {
                
            }
            public virtual System.Data.Entity.Infrastructure.DbRawSqlQuery<PessoasComTelefones> SP_PessoasComTelefones(int PessoaId)
            {
                System.Data.SqlClient.SqlParameter paramPessoaId = new System.Data.SqlClient.SqlParameter("@PessoaId", PessoaId);
                return this.Database.SqlQuery<PessoasComTelefones>("EXEC sp_ListPessoasComTelefones @PessoaId", paramPessoaId);
            }
        }
        public partial class PessoasComTelefones
        {
            public int PessoaId { get; set; }
            public String  Nome { get; set; }
            public int TelefoneId { get; set; }
            public string Ddd { get; set; }
            public string Numero { get; set; }
        }
    }

    Perceba que @PessoaId que está contido na SP deve também aparecer na hora da criação desse método se não pode ocasionar o erro ... !!!

    Exemplo de utilização

    using (ContextoSP sp = new ContextoSP())
    {
    	IList<PessoasComTelefones> Lista = sp.SP_PessoasComTelefones(3).ToList();
    }
    Dica: crie um Contexto Separado só para Stored Procedure, a organização do seu projeto melhora em muito com essa dica !!!


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr segunda-feira, 31 de março de 2014 20:31
    sexta-feira, 28 de março de 2014 20:55