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.