ADO.NET Entity Framework: o assistente de atualização não adicionará tabelas


93

Eu adicionei um novo ADO.Net Entity Data Model em meu projeto e usei o Update Wizard para adicionar tabelas ao modelo. Cinco das tabelas selecionadas foram adicionadas à superfície de design. Duas outras tabelas não serão adicionadas. Eu os seleciono no assistente e clico em Concluir, mas eles nunca aparecem na superfície de design.

Isso é um bug ou existem algumas situações em que uma tabela não pode ser adicionada ao modelo (por design)?


ATUALIZAÇÃO: O XML (* .edmx) revela o problema.

<!--Errors Found During Generation:
warning 6013: The table/view 'FooBar.dbo.Roles' does not 
have a primary key defined and no valid primary key could be inferred. 
This table/view has been excluded. To use the entity you will need to 
review your schema, add the correct keys and uncomment it.-->
<!--<EntityType Name="Roles">
    <Property Name="role_id" Type="decimal" />
    <Property Name="role_desc" Type="nvarchar" MaxLength="30" />
</EntityType>-->

8
Isso deve ter muito mais votos. Eu não tinha ideia de que o Visual Studio não poderia adicionar a tabela, já que o arquivo .edmx é o único lugar para o qual o erro realmente vai. Esperançosamente eles terão uma caixa de diálogo na v2!
— John Bubriski

+1 - No meu caso, não houve mensagem de erro.
— teynon de

Como você observou, as tabelas que não importavam não tinham chaves primárias. Adicione um PK e pronto.
— Eric

Respostas:


46

A superfície de design é diferente do modelo de entidade. É possível ter uma tabela no mapeamento em seu EDMX que não aparece na superfície de design. Visualize o arquivo como XML para ver se é esse o caso. Neste caso, o Update Wizard não permitirá que você adicione novamente as tabelas, uma vez que já fazem parte do modelo de entidade. Portanto, de modo geral, o Assistente de atualização sabe mais sobre o seu modelo de entidade do que sobre a superfície de design em si .

Não creio que essa seja exatamente a situação em que você está, mas deve dar uma ideia geral para a solução: vá para o XML e procure referências às tabelas em questão.


4
Acabo de ter esse mesmo problema, apaguei uma tabela do modelo e quando fui adicioná-la novamente o designer visual não a mostrou como estando no banco de dados. Para contornar isso, apaguei o texto do arquivo .edmx, mas consegui bagunçar o XML. Se você fizer isso, faça backup do arquivo primeiro, apenas para garantir. Felizmente, consegui encontrar a tag bagunçada com git diff.
— GrandMasterFlush

41

Defina as chaves primárias para todas as tabelas ou apenas uma caixa de seleção desmarcada "Permitir nulo" para qualquer coluna de cada tabela. Funciona para mim :)


2
Acredito que essa seja a resposta correta, pelo menos foi para mim. Obrigado!
— Eric

@Parvinder, lutei com esse problema na maior parte do meu projeto. Eventualmente, sua resposta deixou tudo claro para mim. No meu caso, na tabela In Joining, não especifiquei o campo de chave Not null ou apenas a chave primária. Depois de consertar isso, fiquei tranquilo. Muito obrigado
— PatsonLeaner

O que eu entendi com a resolução é que não podemos adicionar uma tabela ao Modelo de Entidade se i) essa tabela não tiver uma chave primária ou (ii) Não houver coluna Permitir Nulo nessa tabela.
— Murtuza Khan

10

1. Altere a estrutura da tabela e adicione uma coluna primária. Atualize o modelo.

2.Modifique o arquivo .EDMX no Editor de XML e tente adicionar uma nova coluna sob a tag para esta tabela específica. (NÃO FUNCIONA)

3. Em vez de criar uma nova coluna primária para a tabela Exiting, farei uma chave composta envolvendo todas as colunas existentes. (TRABALHADO)

Entity Framework: adicionando DataTable sem chave primária ao modelo de entidade.


Eu corri para este mesmo problema. O Modelo de Entidade estava adicionando a tabela, entretanto, ela não estava aparecendo no designer. Também não consegui acessar em código. Eu adicionei um campo de ID Key ... funcionou!
— Ravi Ram

6

Eu também tive esse problema, todas as opções acima não funcionaram para mim. O que me ajudou foi o seguinte.

Quando você tenta se conectar a um banco de dados, esse banco de dados pode ter usuários diferentes com credenciais diferentes que pode aceitar. Digamos que o usuário A até D.

Se você tentar se conectar a um usuário, certifique-se de que ele tenha as credenciais corretas habilitadas, neste caso, as opções de leitura e gravação habilitadas.

Para fazer isso, inicie o MS SQL Server Managment Studio, conectado ao seu servidor SQL e selecione o banco de dados com o qual você tenta fazer uma conexão no Visual Studio. Em 'your_dbname' -> Segurança -> Usuários, você encontra uma lista de usuários. Clique com o botão direito do mouse no nome de usuário com o qual deseja fazer login e selecione propriedades. Uma janela se abre. Selecione a página 'Geral' (selecionada por padrão) e na guia 'Associação de função de banco de dados' certifique-se de que 'db_datareader' e 'db_datawrite' estejam selecionados.

Nota: Ao fazer login também no MS SQL Server Managment Studio, certifique-se de fazer login com um usuário que pode ativar / desativar essas opções ...


5

Verifique se há 'Nulos' em sua tabela específica. Se todas as colunas forem definidas como 'Permitir Nulo', Entity Framework considera uma tabela 'Nula'. Eu tive o mesmo problema e desmarquei 'Permitir Nulo' e adicionou a tabela necessária.


1
Funciona, estúpido, nenhum erro nem aviso aparece nos logs!
— RolandoCC



1

Isso foi resolvido na versão mais recente (ambiente: VS 2012, .net framework 4.5). Simplesmente abra o arquivo .edmx e adicione as tabelas / procedimentos armazenados / visualizações necessárias. A tabela / visão que não possui a chave primária será criada como tabela / visão somente leitura.

A tabela / visão 'TABLE_NAME' não possui uma chave primária definida. A chave foi inferida e a definição foi criada como uma tabela / visão somente leitura.


1
o erro permanece em alguns casos, de qualquer maneira, evento no EF 5.0
— Greg Z.

0

Você não precisa excluir o modelo inteiro (isso pode ser centenas de tabelas!).

O assistente pode lidar com a "adição de novos" itens, mas algumas alterações, como alterar chaves compostas e renomear colunas - ele não sabe o que fazer - portanto, não tenta - e as coisas ficam fora de sincronia.

ASSIM: APAGUE as tabelas em questão do Modelo (modo conceitual) E do Model.Store, e então atualize o modelo usando o Wizard, e adicione novamente apenas as tabelas em questão.


0

Apenas lançando mais alguns detalhes para quem não teve que fazer isso antes. Estou usando o visual studio 2013 com a atualização 4 instalada. Eu adicionei alguns campos a uma tabela, apaguei a tabela do meu modelo e fui atualizar e não me deixou verificar nenhuma das tabelas.

Eu tenho uma chave primária.

Criei uma nova tabela de teste, que apareceu e me permitiria verificar, mas não a original.

Nunca o abri em XML antes e não sabia como fazer isso. Você clica com o botão direito no arquivo .edmx e "abre com" - escolhe o editor xml.

a mesa em questão tava bem ali, tinha até os novos campos (estranho).

Excluí todas as referências a ele (demorou algumas vezes) - depois de excluir uma e salvar, se você tentar abri-la e ela não for exibida, vá em frente e escolha "visualizar XML" - observe os erros e basicamente siga a bola quicando até limpá-la.

espero que o detalhe extra ajude alguém.

Joe


0

Uma maneira fácil que descobri foi (no SQL Server Management Studio) adicionar uma coluna de ID do tipo INT, desmarcar "Permitir nulos" e, em Propriedades da coluna (de ID) >> Especificação de identidade >> verificar (É identidade), e fazer certo incremento está definido.

Depois que o acima for feito, volte para a janela .edmx, clique com o botão direito e Atualizar modelo do banco de dados.


0

Você pode adicionar uma tabela cruzada de coluna de chave primária. Então o problema está resolvendo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.