Nesta aula iremos aprender como relacionar objetos colocando as primary keys e foreign keys diretamente através do seu código utilizando migrations.
Na aula de hoje vamos utilizar duas tabelas, que são Carro e Marca, para que possamos fazer os exemplos de ligações entre as tabelas. Essas ligações são as foreign keys, primary keys e tudo mais que precisamos para relacionar as tabelas nos banco de dados e também nos objetos.
Teremos um campo marca_id na tabela de Carro e na tabela Marca teremos muitos carros que pertencem a marca.
Neste exemplo será feita a estratégia de code first, ou seja, vamos construir o nosso código com os nossos modelos e, através dos modelos serão gerados os dados na base de dados.
Para fazer os relacionamento entre as tabelas, vamos utilizar algumas assinaturas:
Iremos instalar o EntityFramework:
Em referências do Projeto podemos verificar que foram incluídos referências do EntityFramework:
Criaremos uma classe chamada Modelo
namespace Relacionamento
{
public class Modelo
{
public int Id { get;set };
public string Nome { get;set };
}
}
Criaremos uma classe chamada Carro
namespace Relacionamento
{
public class Carro
{
public int Id { get;set };
public int ModeloId { get;set };
public string Nome { get;set };
public string Ano { get;set };
}
}
Vamos criar um DbContext chamado BaseContext
Quando rodar a migração, o C# irá criar a tabela chamada Relacionamento, que é uma tabela que não existe no SQL Server e será criada automaticamente. A Classe BaseContext vai herdar de DBContext.
namespace Relacionamento
{
class BaseContext: DBContext
{
public BaseContext(): base("Relacionamento") { }
public DbSet< Modelo> Modelos {get;set;}
public DbSet< Carro> Carros {get;set;}
}
}
Iremos agora inserir as assinaturas nas classes.
Na classe Modelo, vamos inserir a assinatura [Key()], onde i Id será Primary Key e autoincrement
namespace Relacionamento
{
public class Modelo
{
[Key()]
public int Id { get;set };
public string Nome { get;set };
}
}
Na classe Clarro, também vamos inserir a assinatura [Key()], onde o Id será Primary Key e autoincrement
namespace Relacionamento
{
public class Carro
{
[Key()]
public int Id { get;set };
public int ModeloId { get;set };
public string Nome { get;set };
public string Ano { get;set };
}
}
Agora vamos inserir a Foreign Key na classe carro, ou seja, a tabela que tem ligação com a classe Modelo
Precisamos também inserir nesta tabela uma propriedade que seja ligado diretamente com o modelo para que ele possa entender que esse modelo fará a ligação com as duas propriedades modelo abaixo.
É necessário também colocar a propriedade Modelo como virtual, para ser possível fazer o Lazy Load.
namespace Relacionamento
{
public class Carro
{
[Key()]
public int Id { get;set };
[ForeignKey("Modelo")]
public int ModeloId { get;set };
public virtual Modelo { get;set };
public string Nome { get;set };
public string Ano { get;set };
}
}
Criaremos também os métodos Salvar() e Todos() na classe Carro.A classe Carro não precisa herdar de DbContext. Permanece como uma classe comum mas para utilizar dados do banco de dados atual, utilizamos o BaseContext.
namespace Relacionamento
{
public class Carro
{
public void Salvar()
{
var db = new BaseContext();
db.Carros.Add(this);
db.SaveChanges();
}
public List< Carro> Todos()
{
var db = new BaseContext();
return db.Carros.ToList();
}
}
}
O próximo passo é digitar no terminal, para o Gerenciador de pacotes que precisamos habilitar as migrações neste objeto e depois gerar as migrações necessárias para que possa fazer um append no banco de dados.
No terminal, vamos digitar o comando Enable-Migrations, que irá criar uma pasta chamada Migrations com o arquivo Configuration.cs
Enable-Migrations
Também precisamos digitar através do terminal que também queremos criar uma migração com esse contexto. Isso significa que queremos uma migração de tudo que temos relacionado que ainda não criamos neste contexto. Então serão geradas todas as tabelas que serão aplicadas na base de dados.
Foi gerado um script de migração chamado TabelasRelacionadas, criando todas as Primary Keys, Foreign Key e index necessários.
Add-Migration Tabelas Relacionadas
Vamos digitar no terminal o comando Update-Database, para que o arquivo de migração seja criado no banco de dados.
Update-Database
Vamos criar um objeto modelo através do programa principal:
namespace Relacionamento
class Program
{
static void Main(string[] args)
{
new Modelo() { Nome="Xt035" }.Salvar();
}
}
Vamos criar um objeto carro através do programa principal:
namespace Relacionamento
class Program
{
static void Main(string[] args)
{
//new Modelo() { Nome="Xt035" }.Salvar();
new Carro() { Nome="Etza", Modelo = Modelo.Todos().First(), Ano = 2019}.Salvar();
}
}
Para buscar um modelo, utilizamos :
namespace Relacionamento
class Program
{
static void Main(string[] args)
{
var modelos = Modelo.Todos();
}
}
Nesta aula iremos aprender como relacionar objetos colocando as primary keys e foreign keys diretamente através do seu código utilizando migrations.
Na aula de hoje vamos utilizar duas tabelas, que são Carro e Marca, para que possamos fazer os exemplos de ligações entre as tabelas. Essas ligações são as foreign keys, primary keys e tudo mais que precisamos para relacionar as tabelas nos banco de dados e também nos objetos.
Teremos um campo marca_id na tabela de Carro e na tabela Marca teremos muitos carros que pertencem a marca.
Neste exemplo será feita a estratégia de code first, ou seja, vamos construir o nosso código com os nossos modelos e, através dos modelos serão gerados os dados na base de dados.
Para fazer os relacionamento entre as tabelas, vamos utilizar algumas assinaturas:
Iremos instalar o EntityFramework:
Em referências do Projeto podemos verificar que foram incluídos referências do EntityFramework:
Criaremos uma classe chamada Modelo
namespace Relacionamento
{
public class Modelo
{
public int Id { get;set };
public string Nome { get;set };
}
}
Criaremos uma classe chamada Carro
namespace Relacionamento
{
public class Carro
{
public int Id { get;set };
public int ModeloId { get;set };
public string Nome { get;set };
public string Ano { get;set };
}
}
Vamos criar um DbContext chamado BaseContext
Quando rodar a migração, o C# irá criar a tabela chamada Relacionamento, que é uma tabela que não existe no SQL Server e será criada automaticamente. A Classe BaseContext vai herdar de DBContext.
namespace Relacionamento
{
class BaseContext: DBContext
{
public BaseContext(): base("Relacionamento") { }
public DbSet< Modelo> Modelos {get;set;}
public DbSet< Carro> Carros {get;set;}
}
}
Iremos agora inserir as assinaturas nas classes.
Na classe Modelo, vamos inserir a assinatura [Key()], onde i Id será Primary Key e autoincrement
namespace Relacionamento
{
public class Modelo
{
[Key()]
public int Id { get;set };
public string Nome { get;set };
}
}
Na classe Clarro, também vamos inserir a assinatura [Key()], onde o Id será Primary Key e autoincrement
namespace Relacionamento
{
public class Carro
{
[Key()]
public int Id { get;set };
public int ModeloId { get;set };
public string Nome { get;set };
public string Ano { get;set };
}
}
Agora vamos inserir a Foreign Key na classe carro, ou seja, a tabela que tem ligação com a classe Modelo
Precisamos também inserir nesta tabela uma propriedade que seja ligado diretamente com o modelo para que ele possa entender que esse modelo fará a ligação com as duas propriedades modelo abaixo.
É necessário também colocar a propriedade Modelo como virtual, para ser possível fazer o Lazy Load.
namespace Relacionamento
{
public class Carro
{
[Key()]
public int Id { get;set };
[ForeignKey("Modelo")]
public int ModeloId { get;set };
public virtual Modelo { get;set };
public string Nome { get;set };
public string Ano { get;set };
}
}
Criaremos também os métodos Salvar() e Todos() na classe Carro.A classe Carro não precisa herdar de DbContext. Permanece como uma classe comum mas para utilizar dados do banco de dados atual, utilizamos o BaseContext.
namespace Relacionamento
{
public class Carro
{
public void Salvar()
{
var db = new BaseContext();
db.Carros.Add(this);
db.SaveChanges();
}
public List< Carro> Todos()
{
var db = new BaseContext();
return db.Carros.ToList();
}
}
}
O próximo passo é digitar no terminal, para o Gerenciador de pacotes que precisamos habilitar as migrações neste objeto e depois gerar as migrações necessárias para que possa fazer um append no banco de dados.
No terminal, vamos digitar o comando Enable-Migrations, que irá criar uma pasta chamada Migrations com o arquivo Configuration.cs
Enable-Migrations
Também precisamos digitar através do terminal que também queremos criar uma migração com esse contexto. Isso significa que queremos uma migração de tudo que temos relacionado que ainda não criamos neste contexto. Então serão geradas todas as tabelas que serão aplicadas na base de dados.
Foi gerado um script de migração chamado TabelasRelacionadas, criando todas as Primary Keys, Foreign Key e index necessários.
Add-Migration Tabelas Relacionadas
Vamos digitar no terminal o comando Update-Database, para que o arquivo de migração seja criado no banco de dados.
Update-Database
Vamos criar um objeto modelo através do programa principal:
namespace Relacionamento
class Program
{
static void Main(string[] args)
{
new Modelo() { Nome="Xt035" }.Salvar();
}
}
Vamos criar um objeto carro através do programa principal:
namespace Relacionamento
class Program
{
static void Main(string[] args)
{
//new Modelo() { Nome="Xt035" }.Salvar();
new Carro() { Nome="Etza", Modelo = Modelo.Todos().First(), Ano = 2019}.Salvar();
}
}
Para buscar um modelo, utilizamos :
namespace Relacionamento
class Program
{
static void Main(string[] args)
{
var modelos = Modelo.Todos();
}
}