Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Alterar a classe Migration ou adicionar uma propriedade nova?

Acredito que a minha dúvida seja teórica, porém agradeceria a ajuda.

Na atividade 02 do exercício "Relacionamentos Um para Muitos no Entity", ao gerar a classe Migration para a classe Compra, a FK "ProdutoId" é gerada permitindo valores nulos:

[... código suprimido ]
ProdutoId = table.Column<int>(nullable: true),
[... código suprimido ]

Para corrigir essa situação, a Migração é desfeita e então adicionamos na classe Compra não só a referência de Produto, mas também uma propriedade "ProdutoId" com valor INT.

Após essa alteração, realizamos uma nova migração e então nesse ponto o Entity compreende o valor "ProdutoId" como NOT NULL:

[... código suprimido ]
ProdutoId = table.Column<int>(nullable: false),
[... código suprimido ]

A minha dúvida portanto é:

Faz sentido adicionar na classe Compra tanto o Produto quanto a propriedade ProdutoId apenas para termos um valor Not Null?

Não seria muito mais prático alterar a flag booleana da classe Migration para false?

//Classe do Instrutor

namespace Alura.Loja.Testes.ConsoleApp
{
   public class Compra
    {
       public int Id { get; internal set; }
       public int Quantidade { get; internal set; }
       public int ProdutoId { get; internal set; } // < Torna FK Not Null
       public Produto Produto { get; internal set; }  // + Ref. de Produto
       public double Preco { get; internal set; }
    }
}
//Classe sem ProdutoId (Gera FK NULL)

namespace Alura.Loja.Testes.ConsoleApp
{
   public class Compra
    {
       public int Id { get; internal set; }
       public int Quantidade { get; internal set; }
       public Produto Produto { get; internal set; } // Apenas Ref. de Produto
       public double Preco { get; internal set; }
    }
}

Com a classe "simplificada", altera-se então a Migration, não permitindo valores nulos:

ProdutoId = table.Column<int>(nullable: false)

Por boas práticas, qual melhor caminho a seguir nesse cenário?

3 respostas
solução!

Olá João Paulo!

Tem um método melhor para isso. Isso você verá nos últimos da formação de .NET, mas uma forma que garantirá o NOT NULL tanto no seu BD, quanto em um formulário web, é usando a anotação [Required]. Colocando essa anotação logo acima de um campo, você dirá que este campo é obrigatório. Para conseguir usar esta anotação, você terá que usar o namespace System.ComponentModel.DataAnnotations, ou seja, escreva a anotação e use ctrl+. para fazer o using deste namespace :)

Você poderia colocar essa anotação logo acima dos campos ou pelo menos acima das IDs. Isso fará com que as colunas se tornem NOT NULL, sem precisar criar manualmente o campo de Id para a chave estrangeira.

Para mais informações, neste link tem informações de como funciona no EF 6 e EF Core.

Neste link, tem informações de como usa este atributo com a parte de formulários.

Espero ter ajudado!

Obrigado, Fabiano!

Confesso que ainda não tinha ouvido falar de annotations no .NET.

Att,

Isso é normal!

Também demorei bastante para descobrir isso. Muitos Frameworks usam essas anotações para facilitar a vida. E como facilita!