Entity Framework - Adicionar propriedade de navegação manualmente

115

Eu gerei um Entity Framework Model (4.0) do meu banco de dados. Eu não projetei o banco de dados e não tenho nenhum controle sobre o esquema, mas existem algumas tabelas que não possuem restrições de chave estrangeira definidas, mas há um relacionamento implícito definido.

Por exemplo:

Eu tenho uma tabela chamada Pessoas que tem as seguintes colunas: GenderID RaceID

Existem tabelas para gênero e raça, mas não há chave estrangeira na tabela Pessoas.

Quando importei o modelo, ele não adicionou Propriedades de navegação para esses relacionamentos. Tentei adicioná-lo manualmente, mas From Role e To Role estão desativados. Não tenho certeza de como adicionar o relacionamento sozinho. Como eu faço isso?

Dismissile
fonte

Respostas:

181

Sim - não é tão simples.

Aqui está o que você faz:

1 - Clique com o botão direito no designer, Adicionar -> Associação

2 - Configurar a associação e cardinalidades (Pessoas * .. 1 Gênero, Pessoas * .. 1 Raça)

3 - Vá para o navegador do modelo -> Associações

4 - Clique com o botão direito nas associações recém-criadas, clique em Propriedades

5 - Aqui você precisa configurar os endpoints para as opções de chave e cascata. Certifique-se de obter os endpoints corretos. Você também pode configurar uma restrição referencial aqui para sua propriedade de navegação implícita.

6 - Mapeie a propriedade de navegação para as tabelas / campos relevantes.

7 - Valide seu modelo, cruze os dedos.

Espero que isto ajude.

RPM1984
fonte
20
1 para salvar o que resta do meu cabelo. Acrescentarei que # 6 requer a alteração da coluna de chave estrangeira na página de propriedades da associação, configuração de restrição referencial. Pressione [...] para abrir a caixa de diálogo de restrição referencial e altere o campo fictício que o designer conectou à tabela filha em Propriedade dependente.
Joel Brown
8
Você também terá que ir para as propriedades da tabela filho e excluir o campo fictício que o designer adicionou (e que não mapeia para nenhum campo real na tabela filho).
Joel Brown
2
No caso de View, também certifique-se de obter a definição da sua Chave Primária correta (clique com o botão direito e selecione os campos relacionados, marque-os como EntityKey nas propriedades). Caso contrário, você pode obter 'Multiplicidade não é válida no papel no relacionamento porque o papel dependente se refere às propriedades-chave ...'
Mikl X
1
Em # 2, você pode querer desmarcar a caixa de seleção "Adicionar propriedades de chave estrangeira à entidade". Isso cria algumas dores de cabeça desnecessárias, se você realmente não precisar.
Criptografia
Depois de atualizar novamente seu modelo do banco de dados, as entidades de scaffold manterão a associação adicionada manualmente?
voodoo_patch
45

Encontrei esta postagem do blog que propõe a seguinte solução, que funcionou muito bem para mim (infelizmente não consegui fazer o RPM1984 funcionar na minha situação).

  1. Adicionar uma associação por meio do plano de fundo do designer clique com o botão direito do mouse no menu contextual
  2. Configure sua associação (certifique-se de desmarcar a criação de chave estrangeira)
  3. Clique com o botão direito na associação e escolha Propriedades
  4. Clique no ...botão para Restrição Referencial
  5. Configure a relação entre as chaves dentro
  6. Verificar (a partir do menu contextual do designer)
  7. ???
  8. Lucro!
dav_i
fonte
4
+1 Ponto 4 me fez fazer certo, esquecido disso com a resposta RPM194.
Hugo Logmans