ASP .NET Core - Iniciando c/ ASP .NET Core MVC e EF Core- X

 Neste artigo eu vamos iniciar a criação de uma aplicação ASP .NET Core MVC usando o Entity Framework Core no Visual Studio.

Estamos criando uma aplicação Web usando ASP.NET Core MVC com Entity Framework Coree Visual Studio.

No artigo anterior alteramos o modelo de dados usando o Migrations e nesta aula vamos incluir novas entidades e relacionamentos em nosso modelo e vamos também customizar o modelo de dados especificando as regras de formatação, validação e mapeamento.

1 - Customizando o modelo de dados usando atributos

Vamos personalizar o modelo de dados usando atributos que especificam regras de mapeamento, formatação, validação no banco de dados. Ao final teremos um modelo de dados mais completo adicionando atributos às classes que já criamos e criando novas classes para o restante das entidades no modelo.

O atributo DataType

Para as datas de inscrição dos alunos, todas as páginas atualmente exibem a data e a hora. O que nos interessa é exibir apenas a hora e para isso podemos usar o recurso Data Annotations para alterar a exibição dos dados nas páginas. Para nosso exemplo vamos incluir um atributo na propriedade DataMatricula da classe Estudante.

Abra o arquivo Estudante.cs da pasta Models e inclua os atributos DataType e DisplayFormat na propriedade DataMatricula conforme mostrado abaixo. Você vai precisar incluir uma referência ao namespace System.ComponentModel.DataAnnotations:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace UniversidadeMacoratti.Models
{
    public class Estudante
    {
        public int EstudanteID { get; set; }
        public string SobreNome { get; set; }
        public string Nome { get; set; }
        [Display(Name ="Data de matricula")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataMatricula { get; set; }
        public ICollection<Matricula> Matriculas { get; set; }
    }
}


O atributo DataType é usado para especificar um tipo de dados mais específico do que o tipo intrínseco do banco de dados. Neste caso, queremos apenas exibr a data, não a data e a hora. A Enumeração DataType fornece muitos tipos de dados, como data, hora, número de telefone, moedas, endereço de e-mail, etc.


O atributo DataType também permite que o aplicativo forneça automaticamente recursos específicos do tipo. Por exemplo, um link mailto: pode ser criado para DataType.EmailAddress e um seletor de data pode ser fornecido para DataType.Date em navegadores que suportam HTML5. O atributo DataType emite atributos HTML5 (atributos de dados pronunciados) que navegadores HTML 5 podem entender. Os atributos DataType não fornecem nenhuma validação.

  • O atributo DataType.Date não especifica o formato da data que é exibida. Por padrão, o campo de dados é exibido de acordo com os formatos padrão com base na CultureInfo do servidor.

  • O atributo DisplayFormat é usado para especificar explicitamente o formato da data:  [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]

A configuração ApplyFormatInEditMode especifica que a formatação deve ser aplicada quando o valor é exibido em uma caixa de texto para edição. (Você pode não querer isso para alguns campos - por exemplo, para valores de moeda, você pode não querer o símbolo de moeda na caixa de texto para edição.)

Você pode usar o atributo DisplayFormat por si só, mas geralmente é uma boa idéia usar o atributo DataType também. O atributo DataType transmite a semântica dos dados ao invés de como processá-lo em uma tela e fornece os seguintes benefícios que você não obtém com DisplayFormat:

  • O navegador pode ativar os recursos HTML5 (por exemplo, para mostrar um controle de calendário, o símbolo monetário apropriado para a localidade, links de e-mail, alguma validação de entrada do lado do cliente, etc.).

  • Por padrão, o navegador renderizará dados usando o formato correto com base em sua localidade.

Execute a aplicação vá para página de Estudantes e você notará que a hora não esta mais sendo exibida na data de matrícula. O mesmo será verdade para qualquer view que usar o modelo Estudante.

O atributo StringLength

Você também pode especificar regras de validação de dados e mensagens de erro usando atributos. O atributo StringLength define o comprimento máximo no banco de dados e fornece validação do lado do cliente do servidor para ASP.NET MVC. Você também pode especificar o comprimento mínimo da string neste atributo, mas o valor mínimo não tem impacto no esquema do banco de dados.

Suponha que você queira garantir que os usuários não digitem mais de 50 caracteres para um nome. Para adicionar essa limitação, adicione os atributos StringLength às propriedades Nome e Sobrenome,   conforme mostrado no exemplo a seguir

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace UniversidadeMacoratti.Models
{
    public class Estudante
    {
        public int EstudanteID { get; set; }
        [StringLength(50)]
        public string SobreNome { get; set; }
        [StringLength(50, ErrorMessage = "O nome não pode ser maior que 50 caracteres.")]
        public string Nome { get; set; }
        [Display(Name ="Data de matricula")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataMatricula { get; set; }
        public ICollection<Matricula> Matriculas { get; set; }
    }
}

O atributo StringLength não impedirá que um usuário entre com espaço em branco para um nome. Você pode usar o atributo RegularExpression para aplicar restrições à entrada. Por exemplo, o código a seguir requer que o primeiro caractere seja maiúscula e que os caracteres restantes sejam alfabéticos:

[RegularExpression (@ "^ [A-Z] + [a-zA-Z '' - '\ s] * $")]

O atributo MaxLength fornece funcionalidade semelhante ao atributo StringLength, mas não fornece validação do lado do cliente.

O modelo de banco de dados agora mudou de uma maneira que requer uma alteração no esquema do banco de dados. Você usará migrações para atualizar o esquema sem perder os dados que você tenha adicionado ao banco de dados usando a interface do usuário do aplicativo.

Salve as alterações e dê um build no projeto. Em seguida, abra a janela de comandos na pasta do projeto e insira os seguintes comandos

dotnet ef migrations add MaxLengthNosNomes
Note a mensagem de alerta sobre a possível perda de dados devido a alteração no tamanho do campo de dados.
dotnet ef database update

O Migrations cria um arquivo chamado  <timeStamp>_MaxLengthNosNomes.cs contendo o método Up que vai atualizar o banco de dados para corresponder ao modelo atual e o método Down para reverter o processo. (Neste caso o comando usado seria :  dotnet ef migrations remove)

O timestamp prefixado para o nome do arquivo de migração é usado por Entity Framework para ordenar as migrações. Você pode criar múltiplas migrações antes de executar o comando update-database e, em seguida, todas as migrações são aplicadas na ordem em que foram criadas.

Execute o aplicativo, selecione a guia Estudantes, clique em Criar novo Estudante e insira um nome com mais de 50 caracteres. Quando você clica em Criar, a validação do lado do cliente mostra uma mensagem de erro conforme mostra a figura a seguir:

O atributo Column

Podemos também usar atributos para controlar como a classes e propriedades são mapeadas para o banco de dados. O atributo Column pode ser aplicado às propriedades de uma classe para alterar o comportamento padrão usando pelo EF Core. Ao usar a abordagem Code-First o EF Core usa a convenção padrão e cria um nome de coluna igual ao nome da propriedade que foi definida no modelo de entidades.

Podemos usar o atributo Column para sobrescrever a convenção padrão fazendo com que o nome da coluna seja alterado para o especificado no atributo Column para uma determinada propriedade. Veja o exemplo abaixo:

   [Column("PrimeiroNome")]
   public string Nome { get; set; }

Este código fará com que ao aplicar o Migrations o nome da coluna no banco de dados será alterado de Nome para PrimeiroNome.

No momento não vamos aplicar esse atributo a nenhuma propriedade do nosso modelo de entidades.

O atributo Required

O atributo Required torna os campos de propriedades de nomes obrigatórios. Este atributo não é preciso para tipos não anuláveis, como tipos de valor (DateTime, int, double, float, etc.). Os tipos que não podem ser nulos são tratados automaticamente como campos obrigatórios.

Você pode remover o atributo Required e substituí-lo por um parâmetro de comprimento mínimo no atributo StringLength:

        [Required]
        [StringLength(50)]
        [Display(Name = "Último Nome")]
        public string SobreNome { get; set; }

 

        [Display(Name ="Último Nome")]
        [StringLength(50,MinimumLength =1)]
        public string SobreNome { get; set; }

O atributo Display

Vamos alterar o código da classe Estudante conforme abaixo usando o atributo Display:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace UniversidadeMacoratti.Models
{
    public class Estudante
    {
        public int EstudanteID { get; set; }
        [Required]
        [StringLength(50)]
        [Display(Name = "Último Nome")]
        public string SobreNome { get; set; }
        [Required]
        [StringLength(50, ErrorMessage = "O nome não pode ser maior que 50 caracteres.")]
        [Display(Name = "Primeiro Nome")]
        public string Nome { get; set; }
        [Display(Name ="Data de matricula")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataMatricula { get; set; }
        [Display(Name = "Nome Completo")]
        public string NomeCompleto
        {
            get { return SobreNome + ", " + Nome; }
        }
        public ICollection<Matricula> Matriculas { get; set; }
    }

O atributo Display especifica que a legenda para as caixas de texto deve ser "Primeiro Nome", "Último Nome", "Nome Completo" e "Data de matrícula" em vez do nome da propriedade em cada instância (que não possuem espaços dividindo as palavras) .

A propriedade calculada NomeCompleto esta sendo usada para retornar um valor criado pela concatenação das propriedades Nome e Sobrenome. Por isso ela possui somente o acessor get e assim nenhuma coluna NomeCompleto será gerada no banco de dados.

Na próxima aula vamos continuar incluindo novas entidades em nosso modelo de entidades.

(Disse Jesus) Todo o que o Pai me dá virá a mim; e o que vem a mim de maneira nenhuma o lançarei fora.
João 6:37

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?


Referências:


José Carlos Macoratti