Tipos complexos – EF Designer
Este tópico mostra como mapear tipos complexos com o EF Designer (Entity Framework Designer) e como consultar entidades que contêm propriedades de tipo complexo.
A imagem a seguir mostra as janelas principais que são usadas ao trabalhar com o EF Designer.
Observação
Quando você cria o modelo conceitual, talvez sejam exibidos avisos sobre entidades e associações não mapeadas na Lista de Erros. Você pode ignorar esses avisos, porque depois de optar por gerar o banco de dados com base no modelo, os erros desaparecerão.
O que é um tipo complexo
Tipos complexos são propriedades não escalares de tipos de entidade que permitem que propriedades escalares sejam organizadas dentro das entidades. Assim como as entidades, os tipos complexos consistem em propriedades escalares ou outras propriedades de tipo complexo.
Ao trabalhar com objetos que representam tipos complexos, lembre-se do seguinte:
- Os tipos complexos não têm chaves e, portanto, não podem existir independentemente. Eles só podem existir como propriedades de tipos de entidades ou outros tipos complexos.
- Os tipos complexos não podem participar de associações e nem conter propriedades de navegação.
- As propriedades de tipo complexo não podem ser nulas. Uma **InvalidOperationException **ocorre quando DbContext.SaveChanges é chamado e um objeto complexo nulo é encontrado. As propriedades escalares de objetos complexos podem ser nulas.
- Os tipos complexos não podem herdar de outros tipos complexos.
- É preciso definir o tipo complexo como uma classe.
- O EF detecta as alterações nos membros de um objeto de tipo complexo quando DbContext.DetectChanges é chamado. O Entity Framework chama DetectChanges automaticamente quando os seguintes membros são chamados: DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, DbContext.Entry e DbChangeTracker.Entries.
Refatorar as propriedades de uma entidade em novo tipo complexo
Se você já tiver uma entidade no modelo conceitual, o ideal será refatorar algumas das propriedades em uma propriedade de tipo complexo.
Na superfície do designer, selecione uma ou mais propriedades (excluindo as propriedades de navegação) de uma entidade, clique com o botão direito do mouse e selecione Refatorar -> Mover para Novo Tipo Complexo.
Um novo tipo complexo com as propriedades selecionadas é adicionado ao Navegador de Modelos. O tipo complexo recebe um nome padrão.
Uma propriedade complexa do tipo recém-criado substitui as propriedades selecionadas. Todos os mapeamentos de propriedades são preservados.
Criar um tipo complexo
Você também pode criar um tipo complexo que não contém propriedades de uma entidade existente.
Clique com o botão direito do mouse na pasta Tipos Complexos no Navegador de Modelos e aponte para AddNew Complex Type…. Como alternativa, você pode selecionar a pasta Tipos Complexos e pressionar a tecla INSERT do teclado.
Um novo tipo complexo será adicionado à pasta com um nome padrão. Agora você pode adicionar propriedades ao tipo.
Adicionar propriedades a um tipo complexo
As propriedades de um tipo complexo podem ser tipos escalares ou tipos complexos existentes. No entanto, as propriedades de tipo complexo não podem ter referências circulares. Por exemplo, um tipo complexo OnsiteCourseDetails não pode ter uma propriedade do tipo complexo OnsiteCourseDetails.
Você pode adicionar uma propriedade a um tipo complexo usando uma das maneiras listadas abaixo.
Clique com o botão direito do mouse em um tipo complexo no Navegador de Modelos, aponte para Adicionar e para Propriedade Escalar ou Propriedade Complexa e selecione o tipo de propriedade desejado. Como alternativa, você pode selecionar um tipo complexo e pressionar a tecla INSERT do teclado.
Uma nova propriedade será adicionada ao tipo complexo com um nome padrão.
OU –
Clique com o botão direito do mouse em uma propriedade de entidade na superfície do EF Designer e selecione Copiar. Depois, clique com o botão direito do mouse no tipo complexo no Navegador de Modelos e escolha Colar.
Renomear um tipo complexo
Quando você renomeia um tipo complexo, todas as referências ao tipo são atualizadas em todo o projeto.
Clique duas vezes em um tipo complexo no Navegador de Modelos. O nome será selecionado e ficará no modo de edição.
OU –
Clique com o botão direito do mouse em um tipo complexo no Navegador de Modelos e selecione Renomear.
OU –
Escolha um tipo complexo no Navegador de Modelos e pressione a tecla F2.
OU –
Clique com o botão direito do mouse em um tipo complexo no Navegador de Modelos e selecione Propriedades. Edite o nome na janela Propriedades.
Adicionar um tipo complexo existente a uma entidade e mapear as propriedades para colunas de tabela
Clique com o botão direito do mouse em uma entidade, aponte para Adicionar Nova e selecione Propriedade Complexa. Uma propriedade de tipo complexo com um nome padrão será adicionada à entidade. Um tipo padrão (escolhido nos tipos complexos existentes) será atribuído à propriedade.
Atribua o tipo desejado à propriedade na janela Propriedades. Depois de adicionar uma propriedade de tipo complexo a uma entidade, mapeie as propriedades para colunas de tabela.
Clique com o botão direito do mouse em um tipo de entidade na superfície de design ou no Navegador de Modelos e selecione Mapeamentos de Tabela. Os mapeamentos de tabela são exibidos na janela Detalhes do Mapeamento.
Expanda o nó Mapeado para <Nome da Tabela>. Um nó Mapeamentos de Coluna será exibido.
Expanda o nó Mapeamentos de Coluna. Uma lista de todas as colunas da tabela será exibida. As propriedades padrão (se houver) para as quais as colunas são mapeadas são listadas no título Valor/Propriedade.
Selecione a coluna que deseja mapear e clique com o botão direito do mouse no campo Valor/Propriedade correspondente. Uma lista suspensa de todas as propriedades escalares será exibida.
Escolha a propriedade apropriada.
Repita as etapas 6 e 7 para cada coluna da tabela.
Observação
Para excluir um mapeamento de coluna, selecione a coluna que deseja mapear e clique no campo Valor/Propriedade. Em seguida, selecione Excluir na lista suspensa.
Mapear uma importação de função para um tipo complexo
As importações de função são baseadas em procedimentos armazenados. Para mapear uma importação de função para um tipo complexo, as colunas retornadas pelo procedimento armazenado correspondente precisam corresponder às propriedades do tipo complexo em número e ter tipos de armazenamento compatíveis com os tipos de propriedades.
Clique duas vezes em uma função importada que deseja mapear para um tipo complexo.
Preencha as configurações da nova importação de função da seguinte maneira:
Especifique o procedimento armazenado para o qual você está criando uma importação de função no campo Nome do Procedimento Armazenado. Esse campo é uma lista suspensa que exibe todos os procedimentos armazenados do modelo de armazenamento.
Especifique o nome da importação de função no campo Nome da Importação de Função.
Selecione Complexo como o tipo de retorno e especifique o tipo de retorno complexo específico escolhendo o tipo apropriado na lista suspensa.
Clique em OK. A entrada de importação de função será criada no modelo conceitual.
Personalizar mapeamento de coluna para a importação de função
- Clique com o botão direito do mouse na importação de função no Navegador de Modelos e selecione Mapeamento da Importação de Função. A janela Detalhes do Mapeamento será exibida e mostrará o mapeamento padrão para a importação de função. As setas indicam os mapeamentos entre valores de colunas e valores de propriedades. Por padrão, os nomes de colunas são considerados iguais aos nomes de propriedades do tipo complexo. Os nomes de colunas padrão são exibidos em um texto cinza.
- Se necessário, altere os nomes de colunas para que correspondam aos nomes de colunas retornados pelo procedimento armazenado que corresponde à importação de função.
Excluir um tipo complexo
Quando você exclui um tipo complexo, o tipo é excluído do modelo conceitual e os mapeamentos para todas as instâncias do tipo são excluídos. No entanto, as referências ao tipo não são atualizadas. Por exemplo, se uma entidade tiver uma propriedade de tipo complexo do tipo ComplexType1 e ComplexType1 for excluído no Navegador de Modelos, a propriedade de entidade correspondente não será atualizada. O modelo não será validado porque contém uma entidade que referencia um tipo complexo excluído. Você pode atualizar ou excluir referências aos tipos complexos excluídos usando o Entity Designer.
Clique com o botão direito do mouse em um tipo complexo no Navegador de Modelos e selecione Excluir.
OU –
Selecione um tipo complexo no Navegador de Modelos e pressione a tecla Delete do teclado.
Consulta de entidades que contêm propriedades de tipo complexo
O código a seguir mostra como executar uma consulta que retorna uma coleção de objetos de tipos de entidades que contêm uma propriedade de tipo complexo.
using (SchoolEntities context = new SchoolEntities())
{
var courses =
from c in context.OnsiteCourses
order by c.Details.Time
select c;
foreach (var c in courses)
{
Console.WriteLine("Time: " + c.Details.Time);
Console.WriteLine("Days: " + c.Details.Days);
Console.WriteLine("Location: " + c.Details.Location);
}
}