Aviso aos internautas: esse post é somente sobre programação se você não é programador, veja alguns outros posts interessantes como este.

02bandeira-eua01bandeira-ingla

Como tenho estudado + de 4 horas por dia para as provas de certificações da microsoft 70-515, 70-516, 70-519 , pude aprender muitas coisas nestas duas semanas. Um feature que adorei no novo Entity Framework 4 é a capacidade de gerar POCO (Plain Old CLR Object) classes. Para quem não sabe o que significa POCO, são classes simples, sem atributos de infra-estrutura ou outras responsabilidades, Aquelas classes de entidades que escreviamos antigamente antes de alguns ORM de hoje como EF e Linq to Sql. Pretendemos utilizar este modelo no nosso site: http:www.placetoask.com que hoje usa o excelente mas quase descontinuado “Linq to Sql”, bom vamos lá:

  1. Abra o vs 2010 e crie um novo projeto Class Library com nome “Data”;criando o projeto
  2. Adicione ao projeto “Data” um novo item: “Entity Framework Model” com o nome de Northwind(eu usei o northwind mas você pode escolher o database de sua preferencia), escolha “Generate From Database”
    Criando EFM

    Entity Framework

  3. Confirme a copia do DB para o diretório do projeto e escolha Customers, Orders e Products na seleção de Tables. ->
  4. Como eu esqueci uma tabela que queria inserir, é facil atualizar o EFM, com o botão direito escolha “Update MOdel from Database” e selecione a table “Order Details” que relaciona a Orders com Products: ->
  5. Agora que seu modelo está como na figura abaixo, podemos adicionar a geração de código POCO no entity framework Model , se ainda não possue o template POCO, baixe pelo online Templates do VS2010, Add item… -> Online Templates -> Ado.Net Poco Entity Generator, se já possue apenas clique com botão direito no designer do EFM e escolha: “add code generation item…” -> “Ado.Net Poco Generator”
  6. Nesse momento o Code Generation cria dois arquivos: Model1.Context.tt e Model1.tt, nós iremos separar as classes entity que estão dentro do Model1.tt em um novo projeto chamado Entities. Veja o código gerado pelo model1.tt:
  7. Crie uma nova “Class Library” com nome de “Entities”, segure a Shift key e mova o arquivo Model1.tt para o novo projeto, por movermos o arquivo, vamos precisar fazer uma pequena edição no arquivo para que ele possa gerar o codigo corretamente, então na linha 22 do arquivo Model1.tt mude o código: string inputFile = @”Northwind.edmx”; para string inputFile = @”..\Data\Northwind.edmx”;
  8. No projeto data clique no arquivo Model1.Context.tt, e em propriedades defina o atributo: customtoolnamespace para Data
  9. Faça o mesmo para o projeto “Entities” definindo Custom Tool Namespace para “Entities”
  10. Adicione uma referencia do projeto “Entities” no projeto “Data” e depois coloque uma referencia “using Entities;” no arquivo Model1.Context.cs gerado pelo template automático. Obs. Para visualizar o arquivo você precisa habilitar o “show all files” ;
  11. Modifique o template Model1.Context.tt  na linha 44 adicione o código: using Entities; note que se não fizer isso toda vez que modificar o Modelo tera que colocar essa linha no arquivo Model1.Contex.cs gerado pelo template
  12. Adicione a solution um novo projeto Console Application  para testar o que criamos, a primeira coisa a fazer é copiar o config.application do projeto “Data” para o novo projeto Console , esse passo será necessário para qualquer novo projeto  que deseja acessar dados pelo nosso EFM, seja web, windows form etc…
  13. Digite no program.cs o código e execute :
  14. O resultado do código quando rodamos:
  15. Como criar um novo produto? é facil:
  16. O resultado:

Tá lá! Nossa senhora, não imaginava que fosse tão cansativo salvar e inserir telas para um post, qq dúvida comentem que eu quando puder dou uma ajuda.



Bookmark & Share

Reblog this post [with Zemanta]

I love play linq queries in lambda, some days ago i answered a question in stackoverflow:  How to transalte this sql query in lambda?

SELECT COUNT(*) AS [value]
FROM [Persons] AS [t0]
INNER JOIN [personlocations] AS [t1] ON [t0].[personId] = [t1].[personid]
INNER JOIN [Locations] AS [t2] ON [t2].[locationid] = [t1].[locationid]
INNER JOIN [PersonRoles] AS [t3] ON [t0].[personId] = [t3].[personid]
INNER JOIN [Roles] AS [t4] ON [t4].[roleid] = [t3].[roleid]
WHERE ([t4].[description] = ‘Student’) AND ([t2].[description] = ‘Flamengo’)

It’s simple:

var persons = Persons
        .Join(Personlocations, p=>p.PersonId, ps=>ps.Personid,
        (p,ps) =>
new {p,ps}).Where(a => a.ps.Location.Description ==“Flamengo”)
        .Join(PersonRoles,pr=> pr.p.PersonId, r=>r.Personid,(pr,r) =>
new {pr.p,r}).Where(a=>a.r.Role.Description==“Student”)
        .Select(p=>
new {p.p});

or:
var persons = Persons.Where(p=>(p.Personlocations.Select(ps=>ps.Location).Where(l=>l.Description == “Flamengo”).Count() > 0)
&& (p.PersonRoles.Select(pr=>pr.Role).Where(r=>r.Description ==
“Student”).Count() > 0));
or:
var persons = Persons
            .Where(p=>(p.Personlocations.Select(ps=>ps.Location)
            .Select(l=>l.Description).Contains(
“Flamengo”)) &&
            (p.PersonRoles.Select(pr=>pr.Role)
            .Select(r=>r.Description).Contains(
“Student”)));

There are more ways to do this same result in linq. in another post i will discuss some.