Customização de Chamada de Dados - Entity Framework
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
Curtidas 0
Respostas
Luiz Maia
08/12/2009
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
GOSTEI 0
Rubens Cury
08/12/2009
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
GOSTEI 0
Rubens Cury
08/12/2009
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
GOSTEI 0
Luiz Maia
08/12/2009
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
@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
GOSTEI 0
Luiz Maia
08/12/2009
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
GOSTEI 0
Rubens Cury
08/12/2009
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
GOSTEI 0
Luiz Maia
08/12/2009
Blz Rubens, que bom.
Continuamos a sua disposição para qualquer dúvida.
Abraços
Att
Luiz Maia
GOSTEI 0