Entity Framework - Relacionamento entre objetos

Nesta aula iremos aprender como relacionar objetos colocando as primary keys e foreign keys diretamente através do seu código utilizando migrations.

assinaturaAssine nossa Comunidade

Asp Net MVC - Entity Framework

Relacionamento entre objetos

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:

  • VIRTUAL
  • COLLECTION
  • MIGRATIONS
  • LAZY LOAD

Iremos instalar o EntityFramework:

  • Menu Ferramentas -> Console do Gerencidor de Pacotes;
  • No console, digitar Install-Package EntityFramework;

Em referências do Projeto podemos verificar que foram incluídos referências do EntityFramework:

  • Referências
    • 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();  
          }
        }
       
  

Entity Framework - Relacionamento entre objetos

Nesta aula iremos aprender como relacionar objetos colocando as primary keys e foreign keys diretamente através do seu código utilizando migrations.

Próximas Aulas:
assinaturaAssine nossa Comunidade

Asp Net MVC - Entity Framework

Relacionamento entre objetos

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:

  • VIRTUAL
  • COLLECTION
  • MIGRATIONS
  • LAZY LOAD

Iremos instalar o EntityFramework:

  • Menu Ferramentas -> Console do Gerencidor de Pacotes;
  • No console, digitar Install-Package EntityFramework;

Em referências do Projeto podemos verificar que foram incluídos referências do EntityFramework:

  • Referências
    • 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();  
          }
        }