|
<< Click to Display Table of Contents >> Entity Framework |
![]() ![]()
|
Definição
Poder fazer CRUD com qualquer tabela de qualquer banco de dados sem 1 linha de SQL
Como fazer - um exemplo
Primeiro monte uma base (usei SQlite3) com a seguinte estrutura
CREATE TABLE [tipo] (
[cd_tipo] INTEGER PRIMARY KEY AUTOINCREMENT,
[nm_tipo] VARCHAR(30) NOT NULL);
CREATE TABLE caixa (
cd_caixa INTEGER PRIMARY KEY AUTOINCREMENT,
descricao VARCHAR(30) NOT NULL,
data DATE NOT NULL DEFAULT (current_date),
valor DECIMAL(10, 2) NOT NULL,
cd_tipo INTEGER NOT NULL CONSTRAINT [cd_tipo_fk] REFERENCES [tipo]([cd_tipo]));
Note que existe um FK entre as tabelas
No Visual Studio
Crie uma Entity (necessário VS2008 sp1 ou +) baseando-se no banco criado, dê o nome de MinhaEntidade
CRUD
Inserindo um tipo
// inicializa a entidade
MinhaEntidade entidade = new MinhaEntidade();
// cria um tipo
var novo = new tipo() { nm_tipo = "Conta de luz" };
// adiciona na entidade
entidade.AddTotipo(novo);
// "commit"
entidade.SaveChanges();
Inserindo um item do caixa com um novo tipo (FK)
// criar novo registro (com FK)
MinhaEntidade entidade = new MinhaEntidade();
// cria um tipo
var novoTipo = new tipo() { nm_tipo = "Padaria" };
entidade.AddTotipo(novoTipo);
// cria um item caixa usando o tipo criado acima!
var cx = new caixa();
cx.data = DateTime.Now;
cx.descricao = "Bolo e leite";
cx.valor = 10.5;
cx.tipo = novoTipo;
// grava ambos itens
entidade.AddTocaixa(cx);
entidade.SaveChanges();
Buscando todos os tipos e exibindo um DataGridView
MinhaEntidade entidade = new MinhaEntidade();
dataGridView1.DataSource = entidade.tipo;
dataGridView1.Refresh();
Buscando todos os itens de caixa e o nome do tipo associado (note o join)
MinhaEntidade entidade = new MinhaEntidade();
var dados = from t in entidade.caixa
where t.cd_caixa > 10
select new { t.data, t.descricao, t.valor, t.tipo.nm_tipo };
dataGridView1.DataSource = dados;
dataGridView1.Refresh();
Alterando um tipo
MinhaEntidade entidade = new MinhaEntidade();
tipo tp = new tipo();
tp = (from c in entidade.tipo where c.cd_tipo == 3 select c).First();
tp.nm_tipo = "Manutenção do carro";
entidade.ApplyPropertyChanges("tipo", tp);
entidade.SaveChanges();
Excluindo um tipo
MinhaEntidade entidade = new MinhaEntidade();
entidade.DeleteObject((from c in entidade.tipo where c.cd_tipo == 1 select c).First());
entidade.SaveChanges();
Percorrendo os tipos com foreach
MinhaEntidade entidade = new MinhaEntidade();
foreach (tipo tp in entidade.tipo)
{
Console.WriteLine(tp.cd_tipo.ToString() + " - " + tp.nm_tipo);
}
Montando a string de conexão em runtime
Digamos que seu App.Config seja assim:
<connectionStrings>
<add name="ClientesEntity"
connectionString="metadata=res://*/ClientesModel.csdl|res://*/ClientesModel.ssdl|res://*/ClientesModel.msl;
provider=MySql.Data.MySqlClient;
provider connection string="server=server02;User Id=root;password=qwe123;Persist Security Info=True;database=temp1""
providerName="System.Data.EntityClient" />
</connectionStrings>
Você deve programar assim:
using System.Data.EntityClient;
// oriente-se pelas cores
EntityConnectionStringBuilder connStrBuild = new EntityConnectionStringBuilder();
connStrBuild.Metadata = @"res://*/ClientesModel.csdl|res://*/ClientesModel.ssdl|res://*/ClientesModel.msl";
connStrBuild.Provider = "MySql.Data.MySqlClient";
connStrBuild.ProviderConnectionString = "server=server02;User Id=root;password=qwe123;Persist Security Info=True;database=temp1;";
// aqui monta a entidade
ClientesEntity cliente = new ClientesEntity(connStrBuild.ToString());