Fórum Customização de Chamada de Dados - Entity Framework #12732

08/12/2009

0

Olá,   Estou utilizando o Entity Framework como ORM da minha aplicação.   Todas as minhas entidades possuem a propriedade EmpresaID, pois a aplicação precisa atender este requisito.   Sei que se pode controlar/customizar através do ObjectStateManager as operações de ADD, DELETE e INSERT do contexto que estou utilizando, porém gostaria de customizar as operações de chamada, em outras palavras SELECT.   Por exemplo:   //Retorna todos os Clientes. var query = from c in ctx.Clientes select c;   Como fazer para INTERCEPTAR o retorno desta query e de todas as demais para realizar a seguinte verificação:   Se existir na entidade da query que que está sendo realizada, a propriedade "EmpresaID", então adicione o a condição WHERE EmpresaID == Session("EmpresaID") na mesma, filtrando portanto somente os objetos referentes a empresa corrente.   Com esta interceptação/customização, o desenvolvedor poupa tempo no sentido de não precisar especificar tal condição toda vez que realizar uma query. Além disso a aplicação ganha confiabilidade, pois nunca retornará informações de outra empresa, que não seja a empresa corrente.   Estou a disposição para maiores dúvidas.   Rubens Cury        
Rubens Cury

Rubens Cury

Responder

Posts

10/12/2009

Luiz Maia

Ola Rubens, tudo bom?   Seguinte, a única maneira que encontrei de fazer o que vc precisa é usando Stored Procedures, e colocando esta regra dentro da mesma, isto supri sua necessidade? Assim ficaria de facil implementação.   Aguardo Att Luiz Maia
Responder

Gostei + 0

10/12/2009

Rubens Cury

Fala Luiz, tudo bem e contigo ?   Tal solução até me atenderia, mas seria necessário a criação de uma SP para CADA uma das minhas entidades ? Se sim, esse que é o problema entende ? Não to conseguindo achar uma saída "dinâmica" para o meu problema.   Abraço, Rubens Cury  
Responder

Gostei + 0

10/12/2009

Rubens Cury

Luiz, Dê uma olhada no que eu acabei de encontrar... http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx   Será que não conseguimos adaptar para minha necessidade ?   []',s Rubens Cury
Responder

Gostei + 0

10/12/2009

Luiz Maia

Rui, na verdade, se esta começando a desenvolver agora seu sistema, esta solução irá te atender, veja so:   Voce podera criar uma SP para esta verificação e outra SP para o retorno de suas listas, e dentro destas SPs vc chama a unica SP que concatenara a instrução where id_empresa = @tal.     Pode ser assim: create procedure concatena_empresa
 @id_empresa int,
 @str_sql varchar(max)
 
as
 Begin
  If @id_empresa <> '' Then
   -- aqui vc junta as duas querys  
  End
  --retorna o record set 
 End   Ou Assim: create procedure concatena_empresa
 @id_empresa int
 
as
 Begin
  declare @sqlString as varchar(max)
  set @sqlString = ''
 If @id_empresa <> '' Then
   -- aqui vc joga a string de where dentro do sqlString 
  End
  --retorna a string "where id_empresa = @id_empresa"
 End   E depois usaria: call concatena_empresa jogando este valor do retorno numa variavel e so assim concatenaria com o restante da query.   Ficou claro? Deu para entender o raciocinio? Desta forma todas as suas SP passariam por esta que verifica a empresa.   Aguardo retorno Abraços Att Luiz Maia
Responder

Gostei + 0

10/12/2009

Luiz Maia

O uso de qualquer tipo de Design Patter fogue do escopo deste serviço, ok? Esta ligado à arquitetura do sistema.   Uma outra solução seria usar uma Interface, veja o exemplo: Neste exemplo é usado IsActive, no seu sera o ID_Empresa, portanto, basta fazer as mudanças pertinentes ao seu projeto: public interface IEmpresa { int IdEmpresa { get; set; } } Na sua classe: (herda da interface)public partial class Product : IOrderable, IEmpresa { .... }  Seu metodo reutiliz-avel seria o seguinte:public static IQueryable<T> Empresa<T>(this IQueryable<T> items) where T : IEmpresa { return items.Where(item => item.IdEmpresa); }Na query:var products = productRepository.GetAll().Empresa(); Acho que esta solução talvez seria mais facil que as SPs. Mas ainda não testei-as!!!   Abraços Att Luiz Maia
Responder

Gostei + 0

10/12/2009

Rubens Cury

Olá Luiz,   A 2º solução veio muito mais de encontro com o que eu buscava do que a 1ª (SP). Achei melhor também. Vou adaptá-la para mim.   Está perfeito.   Abraço, Rubens Cury
Responder

Gostei + 0

11/12/2009

Luiz Maia

Blz Rubens, que bom.   Continuamos a sua disposição para qualquer dúvida.   Abraços Att Luiz Maia
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar