Ele possui um elemento DefiningQuery, mas nenhum elemento InsertFunction… err

123

Isso está me deixando louco, e o erro não tem sentido para mim:

Não foi possível atualizar o EntitySet 'TableB' porque ele possui um DefiningQuery e nenhum elemento existe no elemento para oferecer suporte à operação atual.

Minhas tabelas são colocadas assim:

TabelaA
int idA (identidade, chave primária)
...

Tabela B
int idA (FK para TableA.idA)
int val

TabelaB não possui chave primária definida no servidor SQL. O Entity Framework importou a tabela e a associação e definiu os dois campos como chave. Mas ele emitirá esse erro quando tento fazer uma inserção na tabela!

O que há de errado??


Edit: Como sugerido por Alex, a solução foi esta:

  1. Clique com o botão direito do mouse no arquivo edmx, selecione Abrir com, editor XML
  2. Localize a entidade no elemento edmx: StorageModels
  3. Remova completamente o DefiningQuery
  4. Renomeie o armazenamento: Schema = "dbo" para Schema = "dbo" (caso contrário, o código gerará um erro dizendo que o nome é inválido)
  5. Remova a propriedade store: Name

Deixei a chave como estava, pois não havia problema em mim que as duas colunas fizessem parte da chave.

Palantir
fonte
6
Obrigado pela atualização - as instruções passo a passo ajudaram este EF a obter o aplicativo de tutorial do ASP.NET MVC funcionando!
Adam Neal
Thnx para isso! Eu tive um problema que o EF não gerou o arquivo edmx adequado para a tabela do sql server 2000 que possui a chave primária. Mas esta instrução salvo me :)
100r
4
3,5 anos depois, e este post ainda está ajudando pessoas, neste caso, ME! ... Para: Palantir pelo descritivo passo a passo (funcionou) e graças a Alex >>> Bravo!
Nanonerd
A solução funcionou para mim. Obrigado
Delavega 16/11
O segredo foi remover "store:" da definição do esquema. Muito bom
Guilherme Ferreira

Respostas:

141

Bem, quando uma tabela é encontrada sem uma PrimaryKey, ela é tratada como uma View.

E as visualizações são exibidas no arquivo EDMX (aberto em um editor XML para ver) no elemento StorageModel \ EntitySet [n] \ DefiningQuery.

Quando você tem um DefiningQuery, a Entidade se torna somente leitura, a menos que você adicione funções de modificação. Você precisa de 3 funções de modificação (também conhecidas como Procedimentos Armazenados), uma para cada uma das Inserções, Atualizações e Exclusões.

Mas você tem duas opções:

Mude a definição de chave:

  1. E convencer a EF de que o que ele acha que é uma visão é realmente uma mesa
  2. Ou adicione as funções de modificação apropriadas

No seu caso, eu recomendo (1).

Alex James
fonte
Eu recebi esse erro ao tentar adicionar uma entidade a uma tabela de junção. Sua sugestão foi corrigida, obrigado!
Walter Stabosz
É excelente ..., Tnks
Mohan Gundlapalli
Não se esqueça de clicar em "Modelo de atualização do banco de dados" no seu arquivo edmx você gerada a partir de banco de dados primeiro
Bashar Abu Shamaa
Eu estou enfrentando mesmo problema, parte estranha é que está funcionando bem em nosso ambiente local e teste, ele simplesmente não está trabalhando no ambiente do cliente (sem brilho)
Mox Shah
13

Basta adicionar uma chave primária à tabela. É isso aí. Problema resolvido.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
Jebastin J
fonte
6

Estava faltando uma chave primária na minha mesa e recebi esta mensagem de erro. Uma coisa que notei foi que depois de adicionar a chave à tabela, eu precisava limpar a tabela do edmx usando o designer, salvar o edmx e atualizá-lo novamente para adicionar a tabela novamente. Não estava pegando a chave já que já foi atribuído como uma visualização. Isso não exigiu a edição manual do edmx.

mlapaglia
fonte
5

Adicione a chave primária à tabela, exclua o modelo do modelo edmx e selecione atualização do banco de dados, crie e execute ...... works


fonte
1

@Palantir. Verifique se as duas tabelas estão com Chaves Primárias definidas e tenha cuidado com várias chaves primárias definidas em uma tabela.

Paulo 'PaulusHC' Gomes
fonte
0
  1. Você precisa abrir manualmente o arquivo .EDMX no bloco de notas ou no bloco de notas ++ ou em qualquer editor de texto de sua escolha.
  2. Localize a entrada em edmx: StorageModels no arquivo aberto na etapa1.
  3. Encontre o elemento DefiningQuery e remova completamente essa tag.
  4. Encontre a loja: Esquema = "dbo" para Esquema = "dbo" (se você pular esta etapa, será gerado um erro do nome inválido).
  5. Salve e feche o arquivo.

Espero que isso resolva o problema.

Brijesh Kumar Tripathi
fonte