Thursday 11 February 2010

Hoje ganhei a minha primeira batalha com a ADO Entity Framework!

No CMS que estou a desenvolver - Olimpo CMS - sempre tive como requisito principal a modulidade. Assim sendo, cada módulo, para além de ser responsável pelas suas acções, é também responsável pelas suas tabelas e seus dados. Não faz sentido o módulo de criação dos menus ter acesso as tabelas com os componentes de cada página e vice-versa.

Sendo assim, faz todo o sentido que a ConnectionString seja partilhada por todos os módulos, ou pelo menos que esteja em local partilhado, já que cada módulo pode obter os seus dados do repositório de dados que entender.

Vamos imaginar que está tudo na mesma base de dados, colocamos a ConnectionString no Web.Config do WebSite tudo iria correr bem! Não poderíamos estar mais errados. Com a Entity FrameWork, temos que agora o conceito de MetaData que é onde está descrito os objectos criados e os seus mapeamentos. Sem a MetaData não é possível usar o ADO Entity FrameWork neste exemplo modular, pois, cada módulo necessita, adicionar ao Web.Config a sua ConnectionStrings e a sua MetaData.

O que fiz para resolver este assunto? Simples, no Web.Config coloco a  ConnectionString sem a informação de MetaData e adiciono essa informação em cada módulo quando invoco o objecto EntityModel respectivo, assim:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.Provider = "System.Data.SqlClient";
            entityBuilder.ProviderConnectionString = @"Server=LENOVO-PAP\SQLEXPRESS;Initial Catalog=TEST.NET;Integrated Security=True;MultipleActiveResultSets=True";
            entityBuilder.Metadata = @"res://*/NewModel.csdl|res://*/NewModel.ssdl|res://*/NewModel.msl";

Agora, basta invocar o objecto ADO.NET Entity gerado com a nova connection string.
            Entities model = new Entities(new EntityConnection(entityBuilder.ToString()));
            var lstRET = model.AAA_User.ToList();

Desta forma é possível com uma ConnectionString associar a qualquer objecto ADO.NET Entity sem termos que ter várias ConnectionStrings no Web.Config.

NOTA: Neste exemplo a ConnectionString está hardcoded, mas, no projecto final é para obtermos a partir do Web.Config.


Paulo Aboim Pinto

No comments: