Nesta aula iremos iniciar a criação de um ORM no C#, utilizando a classe reflection iremos varrer todas as propriedades de nossa classe criando então modelos inteligentes e ganhando agilidade no desenvolvimento.
Object Relational Mapping é um framework que utilizamos para gerenciar o Banco de Dados.
São criadas as tabelas, comandos do Sql como insert, select, etc.
Na aula anterior, criamos a classe Usuario na camada Business, outra na camada Database, tornando o processo redundante. Com o ORM , podemos fazer de forma genérica, criando somente uma única classe Usuario em Business que "conversa" com o Database e o Database entende que essa classe é uma tabela no Banco de Dados e busca diretamente no Sql , tudo de forma dinâmica.
Então, como criamos um ORM?
Primeiro, para criar ORM precisamos entender o conceito de Reflexion.
Reflexion é uma classe no C# que consegue descobrir qual o nome, as propriedades e os métodos da sua classe e consegue chamar tantos os métodos quanto as propriedades. Também define atributos e, com todos esses recursos, conseguimos criar algo genérico.
No projeto ORM:
Criamos uma classe OpcoesBase que herda de Attribute para criar assinaturas nas propriedades das classes, por exemplo, da classe Usuario que vamos criar mais adiante.
namespace Database
{
public class OpcoesBase : Attribute
{
public bool UsarNoBancoDeDados {get; set;}
public bool UsarParaBuscar {get; set;}
public bool ChavePrimaria {get; set;}
}
}
Todas as classe que herdarem de IBase, devem implementar os métodos
namespace Database
{
public Interface IBase
{
string Key {get;}
void Salvar();
List< IBase> Todos();
List< IBase> Busca();
}
}
using System.Reflexion;
namespace Database
{
public class Base : IBase
{
private string connectionString = ConfigurationManager,AppSettings["SqlConnection"];
public string Key
{
get
{
foreach(PropertyInfo pi in this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
OpcoesBase pOpcoesBase = (OpcoesBase)pi.GetCustomAttribute(typeof(OpcoesBase))
if (pOpcoesBase != null && pOpcoesBase.ChavePrimaria)
{
return Convert.ToString(pi.GetValue(this));
}
}
return null;
}
}
public virtual void Salvar()
{
using (SqlConnection connection = new SqlConnection(connectionstring))
{
List< string > campos = new List< string >();
List< string > valores = new List< string >();
foreach(PropertyInfo pi in this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
OpcoesBase pOpcoesBase = (OpcoesBase)pi.GetCustomAttribute(typeof(OpcoesBase))
if (pOpcoesBase != null && pOpcoesBase.UsarNoBancoDeDados)
{
campos.Add(pi.Nome);
valores.Add("'" + pi.GetValue(this) + "'");
}
}
string queryString = "insert into " + this.GetType().Name + "s (" + string.Join(", ",campos.ToArray())+ ")
values(" + string.Join(", ",valores.ToArray())
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
}
}
namespace Database
{
public class Usuario : Base
{
[OpcoesBase (UsarNoBancoDeDados = true)]
public string Nome {get;set}
[OpcoesBase (UsarNoBancoDeDados = true)]
public string Telefone {get;set}
[OpcoesBase (UsarNoBancoDeDados = true, chavePrimaria = true, UsarParaBuscar = true)]
public string CPF {get;set;}
}
}
Nesta aula iremos iniciar a criação de um ORM no C#, utilizando a classe reflection iremos varrer todas as propriedades de nossa classe criando então modelos inteligentes e ganhando agilidade no desenvolvimento.
Object Relational Mapping é um framework que utilizamos para gerenciar o Banco de Dados.
São criadas as tabelas, comandos do Sql como insert, select, etc.
Na aula anterior, criamos a classe Usuario na camada Business, outra na camada Database, tornando o processo redundante. Com o ORM , podemos fazer de forma genérica, criando somente uma única classe Usuario em Business que "conversa" com o Database e o Database entende que essa classe é uma tabela no Banco de Dados e busca diretamente no Sql , tudo de forma dinâmica.
Então, como criamos um ORM?
Primeiro, para criar ORM precisamos entender o conceito de Reflexion.
Reflexion é uma classe no C# que consegue descobrir qual o nome, as propriedades e os métodos da sua classe e consegue chamar tantos os métodos quanto as propriedades. Também define atributos e, com todos esses recursos, conseguimos criar algo genérico.
No projeto ORM:
Criamos uma classe OpcoesBase que herda de Attribute para criar assinaturas nas propriedades das classes, por exemplo, da classe Usuario que vamos criar mais adiante.
namespace Database
{
public class OpcoesBase : Attribute
{
public bool UsarNoBancoDeDados {get; set;}
public bool UsarParaBuscar {get; set;}
public bool ChavePrimaria {get; set;}
}
}
Todas as classe que herdarem de IBase, devem implementar os métodos
namespace Database
{
public Interface IBase
{
string Key {get;}
void Salvar();
List< IBase> Todos();
List< IBase> Busca();
}
}
using System.Reflexion;
namespace Database
{
public class Base : IBase
{
private string connectionString = ConfigurationManager,AppSettings["SqlConnection"];
public string Key
{
get
{
foreach(PropertyInfo pi in this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
OpcoesBase pOpcoesBase = (OpcoesBase)pi.GetCustomAttribute(typeof(OpcoesBase))
if (pOpcoesBase != null && pOpcoesBase.ChavePrimaria)
{
return Convert.ToString(pi.GetValue(this));
}
}
return null;
}
}
public virtual void Salvar()
{
using (SqlConnection connection = new SqlConnection(connectionstring))
{
List< string > campos = new List< string >();
List< string > valores = new List< string >();
foreach(PropertyInfo pi in this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
OpcoesBase pOpcoesBase = (OpcoesBase)pi.GetCustomAttribute(typeof(OpcoesBase))
if (pOpcoesBase != null && pOpcoesBase.UsarNoBancoDeDados)
{
campos.Add(pi.Nome);
valores.Add("'" + pi.GetValue(this) + "'");
}
}
string queryString = "insert into " + this.GetType().Name + "s (" + string.Join(", ",campos.ToArray())+ ")
values(" + string.Join(", ",valores.ToArray())
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
}
}
namespace Database
{
public class Usuario : Base
{
[OpcoesBase (UsarNoBancoDeDados = true)]
public string Nome {get;set}
[OpcoesBase (UsarNoBancoDeDados = true)]
public string Telefone {get;set}
[OpcoesBase (UsarNoBancoDeDados = true, chavePrimaria = true, UsarParaBuscar = true)]
public string CPF {get;set;}
}
}