Por que estou recebendo este erro: Nenhum mapeamento especificado para o seguinte EntitySet / AssociationSet - Entity1?

96

Estou usando o Entity Framework 4 com a abordagem Model First.

Iniciei o projeto, desenhei as entidades e gerei o banco de dados. Tudo funcionou bem.

Então eu precisei voltar e adicionar outra entidade ao meu modelo. No entanto, conforme arrasto uma entidade para o EDMX, recebo este erro:

insira a descrição da imagem aqui

Tudo bem! Eu só preciso mapear Entity1 para uma tabela .. Mas hey! Estou usando a abordagem Model First, espero que ele crie a tabela para mim quando gerar o DDL.

Como faço para contornar esse erro?

André Pena
fonte
1
Então, pode gerar um script de banco de dados a partir do seu modelo?
Ladislav Mrnka de

Respostas:

147

Isso ocorre devido à maneira como o EF4 trabalha com o modelo primeiro.

Quando você cria um modelo primeiro, ele está em um estado em que o SSDL não existe. Você pode arrastar entidades, associá-las e assim por diante e ainda, se você der uma olhada no SSDL no arquivo EDMX, você verá que nenhuma das entidades tem uma tabela de armazenamento associada no SSDL.

Isso muda quando você clica no Generate Database From Modelitem do menu de contexto. A parte confusa é que essa ação faz mais do que simplesmente gerar um script DDL. Na verdade, ele altera o arquivo EDMX para incluir informações SSDL. Deste ponto em diante, o arquivo EDMX entrará em um estado em que cada entidade no designer / CSDL deve ser mapeada para uma entidade no SSDL. Se um não mapear, ocorrerá um erro em tempo de compilação:

Nenhum mapeamento especificado para o seguinte EntitySet / AssociationSet - (EntityName)

Outro fato interessante é que não é o tipo de erro que impede a compilação. Ele irá, de fato, gerar a biblioteca de classes de saída. Não deveria ser um aviso ou algo assim?

Para evitar esse erro, tudo o que você precisa fazer após inserir uma nova entidade é Generate Database From Modelnovamente. Isso atualizará o SSDL e corrigirá os mapeamentos.

EDITAR

Se você não estiver usando o modelo primeiro e "atualizar do banco de dados", também terá esse erro no caso de excluir uma tabela no servidor de banco de dados. Isso ocorre porque o Entity Framework não excluirá automaticamente a entidade para você. Exclua a entidade manualmente e o erro desaparecerá.

André Pena
fonte
1
Tive o mesmo problema depois de atualizar meu modelo em relação às alterações bd (isso não poderia ser bom, já que minha abordagem não é o primeiro modelo).
Balanza de
5
@balanza, quando você não está usando o modelo primeiro e atualiza seu modelo com base no banco de dados, você obterá este erro ao excluir uma tabela no servidor porque o designer EF NÃO excluirá a entidade automaticamente. Ao apagar manualmente o tipo de entidade, o erro irá embora
André Pena
Mudei o meu diretamente no arquivo xml do modelo de dados da entidade. Eu tinha muitas tabelas e funções e havia o risco de alguma incompatibilidade, portanto, fiz isso manualmente.
Bat_Programmer
Isso é SUPER útil. Além disso, se você estiver usando o modelo primeiro e "atualizar do banco de dados" e obter novas tabelas, também terá o erro. Mas rodar Generate Database from Model (não há necessidade de realmente executar o script gerado - ele matará seus dados!) Irá corrigir os problemas de mapeamento em seu código e você não terá nenhum problema em usá-lo no futuro.
Brian Warshaw
1
Como você lidaria com a atualização do esquema para o banco de dados SQL Server CE já implantado? Pode mover isso para uma pergunta separada, se for um procedimento totalmente não relacionado
FYK
35

Descobri que estava recebendo o mesmo erro porque tinha esquecido de criar uma restrição referencial depois de criar uma associação entre duas entidades.

Mal
fonte
13
Para sua informação: verifique as propriedades da associação e, na parte inferior, a "Restrição Referencial" estará vazia. Clique nas reticências e crie uma restrição.
Patrice Calvé
Isso me ajudou. Tive que criar um relacionamento 1 .. * de minha entidade de origem para minha entidade de navegação.
duyn9uyen
21

Erro 3027: Nenhum mapeamento especificado para o seguinte EntitySet / AssociationSet ... "- Dores de cabeça do Entity Framework

Se você estiver desenvolvendo um modelo com o Entities Framework, poderá encontrar este erro irritante às vezes:

Erro 3027: Nenhum mapeamento especificado para o seguinte EntitySet / AssociationSet [Entity or Association Name]

Isso pode não fazer sentido quando tudo parece bem no EDM, mas é porque esse erro geralmente não tem nada a ver com o EDM. O que deveria dizer é "regenerar seus arquivos de banco de dados".

Veja, o Entities verifica o SSDL e o MSL durante a compilação, então se você apenas mudou seu EDM, mas não usa Gerar Modelo de Banco de Dados ... então ele reclama que há algo faltando em seus scripts sql.

então, em resumo, a solução é: "Não se esqueça de gerar o modelo de banco de dados todas as vezes após atualizar seu EDM se estiver fazendo o primeiro desenvolvimento do modelo. Espero que seu problema seja resolvido".

Azeem ahmad
fonte
Isso funcionou para o mesmo erro, fazer o Gerar modelo de banco de dados ajudou a limpar a exceção
kolexinfos
7

No meu caso, outro desenvolvedor removeu algumas das tabelas do banco de dados subjacente. Quando percebi isso e removi essas tabelas da entidade, o problema foi resolvido. Não era tão óbvio quanto parece.

Graham Laight
fonte
6

Encontrei o mesmo erro, mas não estava usando o modelo primeiro. Acontece que, de alguma forma, meu arquivo EDMX continha uma referência a uma tabela, embora ela não tenha aparecido no designer. Curiosamente, quando fiz uma pesquisa de texto pelo nome da tabela no Visual Studio (2013), a tabela não foi encontrada.

Para resolver o problema, usei um editor externo (Notepad ++) para encontrar a referência à tabela incorreta no arquivo EDMX e, em seguida, (cuidadosamente) removi todas as referências à tabela. Lamento dizer que não sei como o arquivo EDMX chegou a esse estado em primeiro lugar.

varíola
fonte
5

Eu tive uma mudança de tabela e ela criou outra entidade com um número 1 no final (como MyEntity1e a MyEntity), conforme confirmado pelo navegador de modelo edmx. Algo sobre as duas entidades juntas confundiu o processamento.

A remoção da tabela e a readição corrigiu-a.


Observe que se o TFS estiver conectado, faça um check-in do edmx após a exclusão. Então, e somente então, pegue o mais recente e adicione-o novamente em um processo definido de duas etapas. Caso contrário, o TFS se confunde com a exclusão e a adição das mesmas entidades nomeadas, o que parece causar problemas.

ΩmegaMan
fonte
Eu tive o mesmo problema depois de uma mudança de mesa. Encontrei as mesmas entidades com um número 1 e 2 (MyEntity1, MyEntity2) em vários lugares no modelo. Eu olhei em todos os ramos (diagramas, tipos de entidade, etc.) e removi todas as instâncias de MyEntity e MyEntity [n]. Para uma boa medida, fiz uma "Solução Limpa" e, em seguida, atualizei do banco de dados para adicionar novamente apenas MyEntity.
MsTapp de
4

Uma maneira mais rápida para mim foi excluir as tabelas e adicioná-las novamente. Ele os mapeou automaticamente. :)

Atul K.
fonte
2

Para aqueles que estão usando a Database Firstabordagem, tudo o que você precisa fazer após inserir uma nova entidade é Generate Database From Modelclicar novamente com o botão direito no seu .edmxarquivo e selecionarGenerate Database From Model...

Masoud Darvishian
fonte
0

Tive esse erro quando excluí uma tabela do banco de dados. Resolvido clicando com o botão direito no diagrama EDMX, indo para Propriedades, selecionando a tabela da lista na janela Propriedades e excluindo-a (usando a tecla delete) do diagrama.

amor ao vivo
fonte
0
  1. Vá para o Solution Explorer, clique no botão Pesquisar
  2. Deixe marcado Search within file contenteSearch External Files
  3. Digite o nome das entidades que seu mapeamento não está reconhecendo.
  4. Exclua todos os arquivos RELACIONADOS ao problema. Esses provavelmente terão o nome da mesma entidade ausente. NÃO exclua nenhum arquivo com o seu nome de classe de contexto no arquivo, especialmente se as extensões forem .cs ou .tt. No arquivo Context .cs .
  5. remova todas as linhas de códigos que fazem referência à entidade ausente. Eles ficarão assim:

    public virtual DbSet< Entity1> Entity1 { get; set; }

Este erro é comum em tabelas excluídas do banco de dados.

Quando alguém elimina uma tabela no banco de dados, ou apenas altera o web.config.connectionStringspara o banco de dados EF Mapped, para apontar para um novo e não aquele usado para gerar os mapeamentos originais é o problema.

É esse novo banco de dados que essas entidades com o erro 3027 não estão presentes.

MarcoSantana
fonte
0

Ocorreu um erro ao tentar criar um resultado personalizado para um procedimento armazenado e presumi que deveria ser uma entidade.

A solução foi que acabei de criar um tipo complexo no navegador do modelo e atribuí-lo como resultado às "Importações de função de edição".

Vou adicioná-lo aqui, pois parece que essa pergunta é para onde o Google o levará quando você receber esse erro.

Thomas Koelle
fonte
0

Eu havia configurado tudo corretamente (cardinalidades e propriedades dependentes), mas não conseguia descobrir por que continuo recebendo erros. Finalmente descobri que, EF gerou uma coluna na tabela dependente por conta própria (table_tablecolumn) e não tem nenhuma relação com a tabela, então nenhum mapeamento foi especificado. Tive que deletar a coluna no arquivo EDMX e reconstruir a solução que corrigiu o problema. Estou usando a abordagem DB.

user2965957
fonte
0

Atualizar o modelo do banco de dados não funciona para mim.

Tive que remover a entidade em conflito, executar Atualizar modelo do banco de dados e, por último, reconstruir a solução. Depois disso, tudo funciona bem.

Willy David Jr
fonte
0

Compartilhando isso com outras pessoas. No meu caso, estávamos trabalhando em uma solução MVC compartilhada e usando um módulo comum para tabelas que usamos para dropdowns. Recebi o erro quando atualizei o modelo de entidade adicionando uma nova tabela. Acontece que quando atualizei o EDMX, ele provavelmente atualizou meus direitos de acesso no banco de dados, o que resultou em não ter acesso àquela determinada tabela que me fornecia no mapping specified.

Apenas adicionar novamente e dar acesso ao meu usuário resolveu o problema.

AdorableVB
fonte
0

Acho que entendi isso por não excluir explicitamente algumas tabelas do edmx antes de renomeá-las e adicioná-las novamente. Em vez disso, apenas renomeei as tabelas e, em seguida, fiz um Update Model from Database, pensando que iria eliminá-las e excluí-las do modelo. Em seguida, fiz outro modelo de atualização do banco de dados e adicionei as tabelas renomeadas.

O site estava funcionando com as novas tabelas, mas ocorreu o erro. Eventualmente, percebi que as tabelas originais ainda estavam no modelo. Eu os apaguei do modelo (clique neles na tela edmx, tecla delete), e então o erro foi embora.

apswrk
fonte