ASP .NET MVC 3 - Alterando o modelo de dados - Data Annotations - EF - IV
Este artigo é baseado no original: Creating an Entity Framework Data Model for an ASP.NET MVC Application (1 of 10) com adaptações e pequenos ajustes feitos por mim.
Antes de prosseguir verifique se você possui os seguintes recursos instalados:
Esta é quarta parte do artigo e você esta chegando agora deve ler obrigatoriamente as partes anteriores:
Neste artigo vamos mostrar como alterar o modelo de dados atual incluindo mais entidades e relacionamentos usando os atributos Data Annotation para controlar o comportamento do nosso modelo de classes.
Usando atributos para controlar a formatação, validação e o mapeamento do banco de dados
Abra o Visual Web Developer 2010 Express Edition e no menu File clique em Open Project; a seguir selecione o projeto que já foi criado no terceiro artigo com o nome UniversidadeMacoratti e clique em OK;
A estrutura do projeto exibida na janela Solution Explorer deverá ser a seguinte:
Obs: Se você quiser continuar a partir deste artigo faça o download do projeto UniversidadeMacoratti_3.zip para abri-lo no Visual Web Developer 2010 Express Edition.
O modelo de classes definido em nossa aplicação utiliza as seguintes entidades: Estudante, Curso, Matricula:
A seguir veremos os atributos que você pode incluir ao modelo de classes existente para especificar a formatação, validação e o mapeamento do banco de dados. Para isso vamos alterar o modelo de dados Escola pela inclusão de atributos as classes que já foram criadas e criar novas classes para o resto dos tipos das entidades no modelo.
Usando o atributo DisplayFormat
Nas páginas da nossa aplicação atual a data de matrícula do estudante exibe a hora junto com a data mas o que nos interessa na verdade é somente a data. Vamos então usar os atributos do Data Annotation para alterar o código permitindo que a informação seja exibida da forma que desejamos em todas as páginas pertinentes.
Os atributos Data
Annotation foram introduzido no .NET 3.5 como uma forma de adicionar a
validação para as classes usadas por aplicações ASP.NET. Desde aquela época,
o RIA Services começou a usar anotações de dados e eles agora fazem parte
do Silverlight também. No EF 4.0 o Code-First permite que você construa um
EDM usando código (C#/VB .NET) e também permite realizar a validação com
atributos Data Annotations. Para este recurso devemos usar o namespace System.ComponentModel.DataAnnotations pois é ele que provê atributos de classes (usados para definir metadados) e métodos que podemos usar em nossas classes para alterar as convenções padrão e definir um comportamento personalizado que pode ser usado em vários cenários. |
Com o projeto aberto, na janela Solution Explorer abra a pasta Model e em seguida abra a o arquivo Estudante.vb.
Inclua a declaração : Imports System.ComponentModel.DataAnnotations
Para utilização do namespace do Data Annotation e a seguir na propriedade DataMatricula inclua o atributo DisplayFormat como mostrado no trecho de código a seguir:
A cadeia de formato {0:d} especifica que apenas uma data curta
deve ser exibida para a propriedade DataMatricula.
A configuração ApplyFormatInEditMode especifica que esta formatação
também deve ser aplicada quando o valor é exibido em uma caixa de texto para
edição.
(Você pode não desejar este comportamento para alguns campos - por exemplo,
para valores de moeda, você pode não querer o símbolo da moeda na caixa de texto
para edição.)
Execute o projeto novamente e abra a página para exibir as informações dos estudantes. Note que a data exibida não inclui mais a informação da hora estando no seu formato dd/mm/yyyy que o que nos interessa. Todas as demais páginas serão afetadas por esta alteração.
Usando o atributo MaxLength
Podemos também regras para validação de dados e mensagens usando atributos. Vamos supor que desejamos limitar o tamanho do nome informado pelo usuário a 50 caracteres. Para implementar isso usando atributos devemos incluir o atributo MaxLength na propriedade Nome.
Abra o arquivo Estudante.vb na pasta Models e altere o código conforme abaixo:
Na propriedade Nome incluímos o atributo <MaxLength(50)> para indicar o tamanho máximo permitido. Se for informado um valor maior a mensagem de erro padrão será exibida.
Na propriedade Sobrenome incluímos o atributo <MaxLenght(50), ErrorMessage:="O sobrenome não pode ter mais de 50 caracteres")> para indicar o tamanho máximo. Se for informado um valor maior a mensagem de erro definida na propriedade ErrorMessage será exibida.
Executando o projeto e abrindo a página para Estudantes; depois de clicar no botão Criar Novo e informar valores para nome e sobrenome iremos obter o resultado abaixo:
É um bom procedimento definir o tamanho máximo das propriedades do tipo string caso contrário o Code First ao criar o banco de dados irá definir as colunas correspondentes com tamanho máximo permitido para strings o que não é muito eficiente.
Usando o atributo Column
Você pode também usar atributos para controlar como suas classes e
propriedades são mapeados para o banco de dados.
Suponha que você tenha definido o nome PrimeiroNome para o campo relativo
ao nome, porque este campo pode conter mais de um nome. Ex: Jose Carlos
Mas você deseja que a coluna de banco de dados venha a ser definida com o nome
Nome, pois os usuários estão acostumados com esse padrão. Para fazer este
mapeamento, você pode usar o atributo de Column.
O atributo Column especifica que quando o banco de dados for criado, a
coluna da tabela Estudante que mapeia para a propriedade PrimeiroNome
seja nomeada como Nome.(e não PrimeiroNome)
Em outras palavras, quando o seu código se referir a Estudante.PrimeiroNome,
os dados serão obtidos ou atualizados na coluna Nome da tabela
Estudante. (Se você não especificar os nomes da coluna, eles terão os
mesmos nomes das propriedades.)
Criando a entidade Instrutor
Abra a pasta Models e com o botão direito do mouse selecione Add -> Class, informando o nome Instrutor.vb a seguir defina o seguinte código neste arquivo:
Imports System.Collections.Generic Imports UniversidadeMacoratti.UniversidadeMacoratti.Models Imports System.ComponentModel.DataAnnotations Public Class Instrutor Public Overridable Property Cursos As ICollection(Of Curso) Public Property InstrutorID As Integer Public ReadOnly Property NomeCompleto As String Get Return PrimeiroNome & ", " & SobreNome End Get End Property <Column("Nome")> _ <Required(ErrorMessage:="O nome é obrigatório.")> _ <Display(Name:="Nome")> _ <MaxLength(50)> _ Public Property PrimeiroNome As String <Required(ErrorMessage:="O sobrenome é obrigatório.")> _ <Display(Name:="Sobrenome")> _ <MaxLength(50)> _ Public Property SobreNome As String <DisplayFormat(DataFormatString:="{0:d}", ApplyFormatInEditMode:=True)> _ <Required(ErrorMessage:="A data de admissão é obrigatória.")> _ <Display(Name:="Data Admissão")> _ Public Property DataAdmissao As Date Public Overridable Property Diretoria As Diretoria End Class |
Atenção
!!! Para que não ocorra um erro durante a definição do código ao lado você deve criar antes na pasta Models a classe Diretoria Clique com o botão direito sobre a pasta Models e selecione Add-> Class e informe o nome Diretoria.vb Vamos definir esta classe mais adiante. Destaques do código: A propriedade PrimeiroNome será mapeada para a coluna Nome no banco de dados A propriedade NomeCompleto é somente leitura e retorna o valor da concatenação da propriedade PrimeiroNome com a propriedade Sobrenome. O atributo Required indica que o campo é obrigatório. O atributo Display define strings localizáveis para os tipos de entidades e membros que são usados na interface do usuário. As propriedades Cursos e Diretoria são propriedades de navegação e são definidas como Overridable (virtual) para poder usar o recurso Lazy Loading do Entity Framework |
Um instrutor pode ensinar em diversos cursos, desse modo a propriedade Cursos é definida como um conjunto de entidades Curso. Por outro lado, um instrutor pode ter apenas uma Diretoria, assim a propriedade Diretoria é definida como uma única entidade Diretoria (que pode ser nula se nenhum cargo for atribuído)
Nota: Observe que várias propriedades são as mesmas nas entidades Estudante e Instrutor. Em outro artigo, onde iremos tratar da herança, vamos refatorar este código usando a herança para eliminar esta redundância.
Criando a entidade Diretoria
Vamos criar a entidade Diretoria criando o o arquivo Diretoria.vb na pasta Modesl e definindo a classe Diretoria. Clique com o botão direito sobre a pasta Models e selecione Add -> Class, informando o nome Diretoria.vb e a seguir defina o seguinte código nesta classe:
Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Public Class Diretoria <Key()> _ Public Property InstrutorID() As Integer <MaxLength(50)> _ <Display(Name:="Localização")> _ Public Property Localizacao() As String Public Overridable Property Instrutor() As Instrutor End Class
|
Usando o atributo Key
Há um relacionamento um-para-zero-ou-um
entre as entidade Instrutor e a entidade Diretoria.
Uma Diretoria só existe em relação ao instrutor que é atribuído e sua chave
primária é também a chave estrangeira para a entidade instrutor.
Mas o Entity Framework não pode reconhecer automaticamente InstrutorID
como a chave primária desta entidade, pois seu nome não segue a convenção usada
pelo EF (ID ou nomedaclasseID); para
que o EF reconheça InstrutorID como chave primária devemos usar o atributo
Key:
<Key()> _
Public Property InstrutorID() As Integer
Definindo uma Propriedade de Navegação
A entidade Instrutor tem uma propriedade de navegação Diretoria anulável (porque um instrutor pode não ter uma Diretoria) , e a entidade Diretoria tem propriedade de navegação Instrutor não-anulável (porque uma Diretoria não pode existir sem um instrutor). Quando uma entidade Instrutor possui uma entidade Diretoria relacionada, cada entidade terá uma referência para o outra em sua propriedade de navegação.
Por isso definimos a propriedade de navegação : Public Overridable Property Instrutor() As Instrutor
Modificando a entidade Curso
Vamos modificar a entidade Curso abrindo o arquivo Curso.vb na pasta Models e alterando o seu código conforme abaixo:
Obs: O código em azul foi incluído na entidade. Como ainda não criamos a entidade Departamento o VWD vai indicar um erro mas não se preocupe deixe assim por enquanto que mais adiante vamos criar a entidade Departamento.
Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Namespace UniversidadeMacoratti.Models Public Class Curso <DatabaseGenerated(DatabaseGeneratedOption.None)> _ <Display(Name:="Number")> _ Public Property CursoID As Integer <Required(ErrorMessage:="O título é obrigatório.")> _ <MaxLength(50)> _ Public Property Titulo As String <Required(ErrorMessage:="O número de créditos é obrigatório.")> _ <Range(0, 5, ErrorMessage:="Número de créditos deve estar entre 0 e 10.")> _ Public Property Creditos As Integer <Display(Name:="Departamento")> _ Public Property DepartamentoID() As Integer Public Overridable Property Departamento() As Departamento Public Overridable Property Instrutores() As ICollection(Of Instrutor) Public Overridable Property Matriculas As ICollection(Of Matricula) End Class End Namespace |
1- O atributo DatabaseGenerated com o parâmetro None na propriedade CursoID especifica que os valores da chave primária são fornecidos pelo usuário, ao invés de serem gerados pelo banco de dados.
<DatabaseGenerated(DatabaseGeneratedOption.None)>
_
<Display(Name:="Number")> _
Public Property CursoID As Integer
Por padrão, o Entity Framework assume que os valores da chave primária são gerados pelo banco de dados. Em geral é esse o cenário padrão, mas para esse exemplo na entidade Curso, você vai usar um número de curso especificado pelo usuário como 1000 para um departamento, 2000 para outro departamento, e assim por diante.
2- As propriedades chave estrangeira e de navegação na entidade Curso de refletem as seguintes relações:
a- Um Curso é atribuído a um departamento, então existe uma chave estrangeira DepartamentoID e uma propriedade de navegação Departamento :
Public Property DepartamentoID() As Integerb- Um Curso pode ter qualquer quantidade de Estudantes matriculados, dessa forma existe uma propriedade de navegação Matriculas;
Public Overridable Property Matriculas As ICollection(Of Matricula)
c- Um curso pode ser ministrado por múltiplos Instrutores , logo existe uma propriedade de navegação Instrutores:
Public Overridable Property Instrutores() As ICollection(Of Instrutor)
Criando a entidade Departamento
Vamos criar a entidade Departamento criando o o arquivo Departamento.vb na pasta Models e definindo a classe Departamento. Clique com o botão direito sobre a pasta Models e selecione Add -> Class, informando o nome Departamento.vb e a seguir defina o seguinte código nesta classe:
Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Imports UniversidadeMacoratti.UniversidadeMacoratti.Models Public Class Departamento Public Property DepartamentoID() As Integer <Required(ErrorMessage:="O Departamento é obrigatório")> _ <MaxLength(50)> _ Public Property Nome() As String <DisplayFormat(DataFormatString:="{0:c}")> _ <Required(ErrorMessage:="O orçamento é requerido.")> _ <Column(TypeName:="money")> _ Public Property Orcamento() As System.Nullable(Of Decimal) <DisplayFormat(DataFormatString:="{0:d}", ApplyFormatInEditMode:=True)> _ <Required(ErrorMessage:="A data de início é requerida.")> _ Public Property DataInicio() As DateTime <Display(Name:="Administrator")> _ Public Property InstrutorID() As System.Nullable(Of Integer) Public Overridable Property Administrator() As Instrutor Public Overridable Property Cursos() As ICollection(Of Curso) End Class |
Anteriormente usamos o atributo Column para alterar o mapeamento do nome
da coluna.
No código da entidade Departamento, o atributo Column está sendo usado
para alterar o mapeamento do tipo de dado SQL para que a coluna seja definida
usando o tipo money do SQL Server no banco de dados:
<DisplayFormat(DataFormatString:="{0:c}")>
_
<Required(ErrorMessage:="O orçamento é requerido.")> _
<Column(TypeName:="money")> _
Public Property Orcamento() As System.Nullable(Of
Decimal)
Isto normalmente não é necessário, porque o Entity Framework escolhe o tipo de dados SQL Server apropriado com base no tipo CLR que você definir para a propriedade. O tipo CLR decimal normalmente mapa para um tipo decimal do SQL Server. Mas neste caso você sabe que a coluna vai usar valores em moeda, e o tipo de dados money é mais apropriado.
As propriedades chave estrangeira e de navegação refletem as seguintes relações:
a - Um departamento pode ou não ter um Administrador, e um administrador é sempre um Instrutor. Portanto, a propriedade InstrutorID esta incluída como uma chave estrangeira para a entidade Instrutor e a propriedade é definida como anulável. A propriedade de navegação é chamada administrador, mas trata uma entidade Instrutor:
Public Property InstrutorID() As System.Nullable(Of Integer)b- Um Departamento pode ter muitos cursos por isso existe uma propriedade de navegação Cursos:
Public Overridable Property Cursos() As ICollection(Of Curso)Modificando a entidade Estudante
Vamos modificar a entidade Estudante abrindo o arquivo Estudante.vb na pasta Models e alterando o seu código conforme abaixo:
Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Namespace UniversidadeMacoratti.Models Public Class Estudante Public Property EstudanteID() As Integer Get Return _estudanteID End Get Set(value As Integer) _estudanteID = value End Set End Property Private _estudanteID As Integer <MaxLength(50, ErrorMessage:="O sobrenome não pode ter mais de 50 caracteres")> _ <Required(ErrorMessage:="O Sobrenome é obrigatório.")> _ <Display(Name:="Sobrenome")> _ Public Property SobreNome() As String Get Return _sobrenome End Get Set(value As String) _sobrenome = value End Set End Property Private _sobrenome As String <MaxLength(50)> _ <Required(ErrorMessage:="O Nome é obrigatório.")> _ <Display(Name:="Nome")> _ Public Property Nome() As String Get Return _nome End Get Set(value As String) _nome = value End Set End Property Private _nome As String <DisplayFormat(DataFormatString:="{0:d}", ApplyFormatInEditMode:=True)> _ <Required(ErrorMessage:="A data de matrícula é obrigatória.")> _ <Display(Name:="Data de matricula")> _ Public Property DataMatricula() As DateTime Get Return _datamatricula End Get Set(value As DateTime) _datamatricula = value End Set End Property Private _datamatricula As DateTime Public Overridable Property Matriculas() As ICollection(Of Matricula) Get Return _matriculas End Get Set(value As ICollection(Of Matricula)) _matriculas = value End Set End Property Private _matriculas As ICollection(Of Matricula) End Class End Namespace |
Observe que nesta classe eu estou usando a notação antiga para definir as propriedades. Fiz isso para você sentir a diferença.
No código acima apenas incluímos (o código destacado em azul) alguns atributos Display e Required que já foram discutidos anteriormente.
Modificando a entidade Matricula
Vamos modificar a entidade Matricula abrindo o arquivo Matricula .vb na pasta Models e alterando o seu código conforme abaixo:
Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Namespace UniversidadeMacoratti.Models Public Class Matricula Public Property MatriculaID As Integer Public Property CursoID As Integer Public Property EstudanteID As Integer <DisplayFormat(DataFormatString:="{0:#.#}", ApplyFormatInEditMode:=True, NullDisplayText:="Sem grau")> _ Public Property Grau As System.Nullable(Of Decimal) Public Overridable Property Curso As Curso Public Overridable Property Estudante As Estudante End Class End Namespace |
Há um relacionamento muitos-para-muitos entre as entidades Estudante e Curso, e a entidade de Matricula corresponde a uma tabela de junção muitos-para-muitos com carga no banco de dados. Isto significa que a tabela Matricula contém dados adicionais além de chaves estrangeiras para as tabelas associadas (neste caso, uma chave primária e uma propriedade de Grau).
Customizando o Contexto
Em seguida, vamos adicionar as novas entidades para a classe ContextoEscola e personalizar alguns dos mapeamentos usando chamadas a API fluente. (A API é "fluente", porque ela muitas vezes é usada por fazer uma série de chamadas de métodos em ma única instrução.) Em alguns casos você precisa usar métodos em vez de atributos, porque não há nenhum atributo para uma função particular. Em outros casos, você pode optar por usar um método quando ambos os métodos e atributos estão disponíveis.
Vamos substituir o código do arquivo ContextoEscola.vb contido na pasta DAL conforme abaixo:
Imports System.Collections.Generic Imports System.Data.Entity Imports UniversidadeMacoratti.UniversidadeMacoratti.Models Imports System.Data.Entity.ModelConfiguration.Conventions Namespace UniversidadeMacoratti.Models Public Class ContextoEscola Inherits DbContext Public Property Cursos() As DbSet(Of Curso) Public Property Departamentos() As DbSet(Of Departamento) Public Property Matriculas() As DbSet(Of Matricula) Public Property Instrutores() As DbSet(Of Instrutor) Public Property Estudantes() As DbSet(Of Estudante) Public Property Diretorias() As DbSet(Of Diretoria) Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder) modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)() modelBuilder.Entity(Of Instrutor)(). HasOptional(Function(p) p.Diretoria). WithRequired(Function(p) p.Instrutor) modelBuilder.Entity(Of Curso)(). HasMany(Function(c) c.Instrutores). WithMany(Function(i) i.Cursos). Map(Function(t) t.MapLeftKey("CursoID"). MapRightKey("InstrutorID"). ToTable("CursoInstructor")) modelBuilder.Entity(Of Departamento)().HasOptional(Function(x) x.Administrator) End Sub End Class End Namespace |
As novas instruções no método OnModelCreating especificam as seguintes
relações:
- relacionamento um-para-zero entre as entidades Instrutor e Diretoria;
modelBuilder.Entity(Of
Instrutor)().
HasOptional(Function(p)
p.Diretoria).
WithRequired(Function(p)
p.Instrutor)
- relacionamento muitos-para-muitos entre as entidades Curso e Instrutor. O código especifica a tabela e os nomes da coluna para a tabela de junção. Primeiro código pode configurar o relacionamento muitos-para-muitos para você sem este código, mas se você não chamá-lo, você terá nomes definidos como InstrutorInstrutorID para a coluna InstrutorID.
modelBuilder.Entity(
Of Curso)().- O relacionamento um-para-zero-ou-um entre as tabelas Instrutor e Departamento representado pela propriedade de navegação Departamento.Administrador:
modelBuilder.Entity(Of Departamento)().HasOptional(Function(x) x.Administrator)
Após estas definições e ajustes vamos alterar o arquivo EscolaInitializer.vb na pasta DAL para reinicializar o nosso modelo novamente de forma que as alterações se reflitam no projeto.
O conteúdo do arquivo EscolaInitializer.vb deve ser alterado conforme o código a seguir:
Imports System.Collections.Generic Imports System.Linq Imports System.Web Imports System.Data.Entity Imports UniversidadeMacoratti.UniversidadeMacoratti.Models Namespace UniversidadeMacoratti.DAL Public Class EscolaInitializer Inherits DropCreateDatabaseIfModelChanges(Of ContextoEscola) Protected Overrides Sub Seed(context As ContextoEscola) Dim estudantes = New List(Of Estudante)() From { _ New Estudante() With { _ .Nome = "Jose Carlos", _ .SobreNome = "Macoratti", _ .DataMatricula = DateTime.Parse("2005-09-01") _ }, _ New Estudante() With { _ .Nome = "Miriam", _ .SobreNome = "Alonso", _ .DataMatricula = DateTime.Parse("2002-09-01") _ }, _ New Estudante() With { _ .Nome = "Jefferson", _ .SobreNome = "Anand", _ .DataMatricula = DateTime.Parse("2003-09-01") _ }, _ New Estudante() With { _ .Nome = "Janice", _ .SobreNome = "Siqueira", _ .DataMatricula = DateTime.Parse("2002-09-01") _ }, _ New Estudante() With { _ .Nome = "Yan", _ .SobreNome = "Li", _ .DataMatricula = DateTime.Parse("2002-09-01") _ }, _ New Estudante() With { _ .Nome = "Bianca", _ .SobreNome = "Justice", _ .DataMatricula = DateTime.Parse("2001-09-01") _ }, _ New Estudante() With { _ .Nome = "Laura", _ .SobreNome = "Norman", _ .DataMatricula = DateTime.Parse("2003-09-01") _ }, _ New Estudante() With { _ .Nome = "Nino", _ .SobreNome = "Olivetto", _ .DataMatricula = DateTime.Parse("2005-09-01") _ } _ } estudantes.ForEach(Function(s) context.Estudantes.Add(s)) context.SaveChanges() ' Dim instrutores = New List(Of Instrutor)() From { _ New Instrutor() With { _ .PrimeiroNome = "Kim", _ .SobreNome = "Novak", _ .DataAdmissao = DateTime.Parse("1995-03-11") _ }, _ New Instrutor() With { _ .PrimeiroNome = "Fadi", _ .SobreNome = "Fakhouri", _ .DataAdmissao = DateTime.Parse("2002-07-06") _ }, _ New Instrutor() With { _ .PrimeiroNome = "Roger", _ .SobreNome = "Harui", _ .DataAdmissao = DateTime.Parse("1998-07-01") _ }, _ New Instrutor() With { _ .PrimeiroNome = "Paulo", _ .SobreNome = "Freire", _ .DataAdmissao = DateTime.Parse("2001-01-15") _ }, _ New Instrutor() With { _ .PrimeiroNome = "Roger", _ .SobreNome = "Afonso", _ .DataAdmissao = DateTime.Parse("2004-02-12") _ } _ } instrutores.ForEach(Function(s) context.Instrutores.Add(s)) context.SaveChanges() Dim departamentos = New List(Of Departamento)() From { _ New Departamento() With { _ .Nome = "Inglês", _ .Orcamento = 350000, _ .DataInicio = DateTime.Parse("2007-09-01"), _ .InstrutorID = 9 _ }, _ New Departamento() With { _ .Nome = "Matemática", _ .Orcamento = 100000, _ .DataInicio = DateTime.Parse("2007-09-01"), _ .InstrutorID = 10 _ }, _ New Departamento() With { _ .Nome = "Engenharia", _ .Orcamento = 350000, _ .DataInicio = DateTime.Parse("2007-09-01"), _ .InstrutorID = 11 _ }, _ New Departamento() With { _ .Nome = "Economia", _ .Orcamento = 100000, _ .DataInicio = DateTime.Parse("2007-09-01"), _ .InstrutorID = 12 _ } _ } departamentos.ForEach(Function(s) context.Departamentos.Add(s)) context.SaveChanges() ' Dim cursos = New List(Of Curso)() From { _ New Curso() With { _ .CursoID = 1050, _ .Titulo = "Quimica", _ .Creditos = 3, _ .DepartamentoID = 3, _ .Instrutores = New List(Of Instrutor)() _ }, _ New Curso() With { _ .CursoID = 4022, _ .Titulo = "Microeconomia", _ .Creditos = 3, _ .DepartamentoID = 4, _ .Instrutores = New List(Of Instrutor)() _ }, _ New Curso() With { _ .CursoID = 4041, _ .Titulo = "Macroeconomia", _ .Creditos = 3, _ .DepartamentoID = 4, _ .Instrutores = New List(Of Instrutor)() _ }, _ New Curso() With { _ .CursoID = 1045, _ .Titulo = "Calculo", _ .Creditos = 4, _ .DepartamentoID = 2, _ .Instrutores = New List(Of Instrutor)() _ }, _ New Curso() With { _ .CursoID = 3141, _ .Titulo = "Trigonometria", _ .Creditos = 4, _ .DepartamentoID = 2, _ .Instrutores = New List(Of Instrutor)() _ }, _ New Curso() With { _ .CursoID = 2021, _ .Titulo = "Composicao", _ .Creditos = 3, _ .DepartamentoID = 1, _ .Instrutores = New List(Of Instrutor)() _ }, _ New Curso() With { _ .CursoID = 2042, _ .Titulo = "Literatura", _ .Creditos = 4, _ .DepartamentoID = 1, _ .Instrutores = New List(Of Instrutor)() _ } _ } cursos.ForEach(Function(s) context.Cursos.Add(s)) context.SaveChanges() cursos(0).Instrutores.Add(instrutores(0)) cursos(0).Instrutores.Add(instrutores(1)) cursos(1).Instrutores.Add(instrutores(2)) cursos(2).Instrutores.Add(instrutores(2)) cursos(3).Instrutores.Add(instrutores(3)) cursos(4).Instrutores.Add(instrutores(3)) cursos(5).Instrutores.Add(instrutores(3)) cursos(6).Instrutores.Add(instrutores(3)) context.SaveChanges() Dim matriculas = New List(Of Matricula)() From { _ New Matricula() With { _ .EstudanteID = 1, _ .CursoID = 1050, _ .Grau = 1 _ }, _ New Matricula() With { _ .EstudanteID = 1, _ .CursoID = 4022, _ .Grau = 3 _ }, _ New Matricula() With { _ .EstudanteID = 1, _ .CursoID = 4041, _ .Grau = 1 _ }, _ New Matricula() With { _ .EstudanteID = 2, _ .CursoID = 1045, _ .Grau = 2 _ }, _ New Matricula() With { _ .EstudanteID = 2, _ .CursoID = 3141, _ .Grau = 4 _ }, _ New Matricula() With { _ .EstudanteID = 2, _ .CursoID = 2021, _ .Grau = 4 _ }, _ New Matricula() With { _ .EstudanteID = 3, _ .CursoID = 1050 _ }, _ New Matricula() With { _ .EstudanteID = 4, _ .CursoID = 1050 _ }, _ New Matricula() With { _ .EstudanteID = 4, _ .CursoID = 4022, _ .Grau = 4 _ }, _ New Matricula() With { _ .EstudanteID = 5, _ .CursoID = 4041, _ .Grau = 3 _ }, _ New Matricula() With { _ .EstudanteID = 6, _ .CursoID = 1045 _ }, _ New Matricula() With { _ .EstudanteID = 7, _ .CursoID = 3141, _ .Grau = 2 _ } _ } matriculas.ForEach(Function(s) context.Matriculas.Add(s)) context.SaveChanges() Dim diretorias = New List(Of Diretoria)() From { _ New Diretoria() With { _ .InstrutorID = 9, _ .Localizacao = "Pedro 17" _ }, _ New Diretoria() With { _ .InstrutorID = 10, _ .Localizacao = "Joao 27" _ }, _ New Diretoria() With { _ .InstrutorID = 11, _ .Localizacao = "Senna 304" _ } _ } diretorias.ForEach(Function(s) context.Diretorias.Add(s)) context.SaveChanges() End Sub End Class End Namespace |
Pronto ! já podemos executar o projeto para verificar as alterações feitas no modelo e seu reflexo em nossa aplicação.
Com isso terminamos essa parte aguarde em breve a abordagem de outros tópicos relacionados ao assunto.
Acompanhe a continuação neste link: ASP .NET MVC - Lendo dados relacionados com EF - V
Pegue o projeto completo aqui: UniversidadeMacoratti_4.zip
"E a ninguém na terra chameis vosso pai, porque um só é o vosso Pai, o qual esta nos céus." "Nem vos chameis mestres, porque um só é o vosso Mestre, que é o Cristo." Mateus 23:9-10
Referências: