Como atualizo um arquivo dbml Linq para SQL?

204

Como atualizo um arquivo .dbml do Linq to SQL?

Ante
fonte

Respostas:

258

Existem três maneiras de manter o modelo sincronizado.

  1. Exclua as tabelas modificadas do designer e arraste-as de volta para a superfície do designer no Database Explorer. Eu descobri que, para que isso funcione de maneira confiável, você deve:

    uma. Atualize o esquema do banco de dados no Database Explorer (clique com o botão direito do mouse, atualize)
    b. Salve o designer depois de excluir as tabelas
    c. Salve novamente depois de arrastar as tabelas de volta.

    Observe, porém, que se você tiver modificado alguma propriedade (por exemplo, desativando a propriedade filho de uma associação), isso obviamente perderá essas modificações - você precisará fazê-las novamente.

  2. Use SQLMetal para gerar novamente o esquema do seu banco de dados. Eu já vi várias postagens de blog que mostram como fazer isso .

  3. Faça as alterações diretamente no painel Propriedades do DBML. Isso funciona para alterações simples, como permitir nulos em um campo.

O designer DBML não é instalado por padrão no Visual Studio 2015, 2017 ou 2019. Você precisará fechar o VS, iniciar o instalador do VS e modificar sua instalação. As ferramentas LINQ to SQL são o recurso que você deve instalar. Para o VS 2017/2019, você pode encontrá-lo em Componentes individuais> Ferramentas de código .

Robert Harvey
fonte
1
Eu tentei 1a e 1c sem 1b e estava recebendo erros 'A transmissão especificada não é válida' ao executar uma seleção simples em uma exibição. Incluindo 1b fixa-lo para mim
tomfumb
6
O apoio VS foi solicitado em connect.microsoft.com/VisualStudio/feedback/details/260723/... , mas MS não quer correção.
Michael Freidgeim
Tentei o primeiro método e funcionou. Acho que funcionará para um pequeno banco de dados.
Muhammedh
Dói-me que, no final de 2019, eu precisei de uma resposta criada antes de saber o que era programação de computadores ... Isso é tão detalhado e ótimo!
PSGuy
54

Para atualizar uma tabela no seu diagrama .dbml com, por exemplo, colunas adicionadas, faça o seguinte:

  1. Atualize sua janela do SQL Server Explorer.
  2. Arraste a versão "nova" da sua tabela para o diagrama .dbml (report1 na figura abaixo).

report1 é a nova versão da tabela

  1. Marque as colunas adicionadas na nova versão da tabela, pressione Ctrl+ Cpara copiar as colunas adicionadas.

copie as colunas adicionadas

  1. Clique na versão "antiga" da sua tabela e pressione Ctrl+ Vpara colar as colunas adicionadas na versão já presente da tabela.

cole as colunas adicionadas à versão antiga da tabela

M463
fonte
4
Esse parece ser o método mais fácil e menos destrutivo que não requer ferramentas extras e funciona muito bem no VS2017
Toby
1
Isso é muito menos invasivo do que a resposta aceita e continua a funcionar bem no final de 2018!
Mark
1
Essa é a melhor resposta para edições rápidas (e não tão rápidas no esquema). Demorei muito para fazer a visualização do modelo parecer boa. Eu odiava excluir e arrastar arquivos de atualização. Para campos adicionados, isso funciona muito bem!
Hucker
1
Para mim, isso resolveu dois problemas. O primeiro foi quando tentei copiar e colar um campo semelhante na tabela e renomeá-lo. Isso criou um erro de construção "não especificado" ininterrupto ao validar. A outra questão era que, se eu removesse a tabela e a adicionasse novamente, ela resultaria em diferenças muito maiores no git (porque os objetos foram reorganizados no arquivo). Com esse método, vejo apenas a inserção do novo campo, que é muito mais limpo e fácil de entender posteriormente.
Goug
BTW, é necessário clicar em "Sim" quando for solicitado com "Os objetos que você está adicionando ao designer usam uma conexão de dados diferente da do designer ..."
Eitanmg
5

Você também pode verificar o PLINQO conjunto de modelos de geração de código, baseado em CodeSmith, que permitem que você faça um monte de coisas legais para e com Linq-to-SQL:

  • gerar um arquivo por classe (em vez de um único arquivo enorme)
  • atualize seu modelo conforme necessário
  • muitos mais recursos

Confira o site do PLINQO em http://www.plinqo.com e dê uma olhada nos vídeos de introdução.

A segunda ferramenta que conheço é a ferramentas Huagati DBML / EDMX , que permitem a atualização dos arquivos de mapeamento DBML (Linq-to-SQL) e EDMX (Entity Framework) e muito mais (como convenções de nomenclatura etc.).

Marc

marc_s
fonte
Tendo acabado arrancado CodeSmith / PLINQO Eu recomendo fortemente contra esta abordagem. É concedida que esta resposta tenha mais de 4 anos de idade ...
Yuck
@ Yuck: neste momento, eu desaconselho fortemente o uso do Linq-to-SQL - use o Entity Framework, uma escolha muito melhor!
marc_s
Sim, ele é. Mover para o EF depois de verificar se o aplicativo funcionaria com um DBML simples, em vez do PLINQO, foi o próximo passo que tirei para remover um aplicativo antigo.
Yuck
4

Usamos um modelo T4 gravado personalizado que consulta dinamicamente o modelo information_schema para cada tabela em todos os nossos arquivos .DBML e, em seguida, substitui partes do arquivo .DBML por novas informações de esquema do banco de dados. Eu altamenterecomendo a implementação de uma solução como esta - ela me economizou muito tempo e, ao contrário de excluir e adicionar novamente suas tabelas ao seu modelo, você mantém suas associações. Com esta solução, você receberá erros em tempo de compilação quando o esquema for alterado. Você quer ter certeza de que está usando um sistema de controle de versão, porque a diferença é realmente útil. Essa é uma ótima solução que funciona bem se você estiver desenvolvendo com uma primeira abordagem de esquema de banco de dados. É claro que não posso compartilhar o código da minha empresa, então você pode escrever isso sozinho. Mas se você conhece algum Linq-XML e pode frequentar a escola nesse projeto , pode chegar onde quer que esteja.

mattmc3
fonte
2

Eu recomendaria o uso do designer visual incorporado no VS2008, pois a atualização do dbml também atualiza o código gerado para você. Modificar o dbml fora do designer visual resultaria em falta de sincronia no código subjacente.

Jason Miesionczek
fonte
4
Sim, mas o designer visual no VS2008 não consegue detectar e responder a mudanças no seu banco de dados subjacente :-( curto de apagar e re-adição, não há suporte para atualizar seu modelo :-(
marc_s
Embora isso seja verdade, a pergunta era muito vaga e não mencionou especificamente como atualizar um modelo quando o banco de dados é alterado.
Jason Miesionczek
2

Há uma nuance na atualização de tabelas e na atualização do DBML ... Os relacionamentos de chave estrangeira nem sempre são trazidos imediatamente se forem feitas alterações nas tabelas existentes. A solução é fazer uma compilação do projeto e adicionar novamente as tabelas novamente. Eu relatei isso ao MS e está sendo corrigido para o VS2010.

A exibição DBML não mostra novas restrições de chave estrangeira


Observe que as instruções dadas na resposta principal não são claras. Para atualizar a tabela

  1. Abra a superfície de design dbml
  2. Selecione todas as tabelas com Direita-> Clique-> Selecionar Tudo ou CTRLa
  3. CTRLx (Cortar)
  4. CTRLv (Colar)
  5. Salve e reconstrua a solução.
ΩmegaMan
fonte
Eu não acredito que ele é fixo, porque relacionada connect.microsoft.com/VisualStudio/feedback/details/414601/... não é fixo
Michael Freidgeim
Você faz suas alterações antes ou depois de recortar e colar?
Kolob Canyon
Já faz 10 anos ... mas acredito que é antes ... faça as alterações e depois vá para o # 2.
ΩmegaMan 10/01
1

No caso de atualização do procedimento armazenado, exclua-o do arquivo .dbml e reinsira-o novamente. Mas se o procedimento armazenado tiver dois caminhos (por exemplo: se algo; exibir algumas colunas; além disso, exibir outras colunas), verifique se os dois caminhos têm os mesmos aliases de colunas !!! Caso contrário, apenas as primeiras colunas do caminho existirão.

Yasser Hosny Abu Elmakarem
fonte
0

Aqui está o método passo a passo completo que funcionou para mim para atualizar o dbml LINQ to SQL e os arquivos associados para incluir uma nova coluna que eu adicionei a uma das tabelas do banco de dados.

Você precisa fazer as alterações em sua superfície de design, conforme sugerido por outras pessoas acima; no entanto, você precisa executar algumas etapas extras. Estas são as etapas completas:

1. Drag your updated table from Server Explorer onto the design surface

2. Copy the new column from this "new" table to the "old" table (see M463 answer for details on this step)

3. Delete the "new" table that you just dragged over

4. Click and highlight the stored procedure, then delete it

5. Drag the new stored procedure and drop into place.

6. Delete the .designer.vb file in the code-behind of the .dbml 
   (if you do not delete this, your code-behind containing the schema will
    not update even if you rebuild and the new table field will not be included)

7. Clean and Rebuild the solution (this will rebuild the .designer.vb file to include all the new changes!).
Jeff
fonte