VS2005 / VS2008 DataSet desenhador, inserir uma linha numa tabela que tem uma coluna guid auto-gerada
-
03-07-2019 - |
Pergunta
Eu tenho um DataTable fortemente tipado criado com o designer VS2005 / VS2008 DataSet.
A tabela tem uma coluna de chave primária que é um guid, que é preenchido pelo servidor SQL. O problema é quando eu quero adicionar uma linha (ou várias linhas) para o meu DataTable e depois chamar o DataAdapter.Update método (passando o DataTable). Quando DataAdapter.Update é chamado recebo uma exceção SQL dizendo que eu não pode inserir NULL na coluna de chave primária.
Como posso dizer ao designer que essa é uma coluna gerada automaticamente e eu não quero fornecer um valor para novas linhas? Eu só quero que o valor gerado pelo SQL.
Am I faltando alguma coisa aqui, ou esta é uma limitação do designer DataSet?
Eu sei como conseguir isso usando LINQ to SQL, mas unfortunatley eu não tê-lo à minha disposição para este projeto.
Solução
Possivelmente um destes:
- Se você não precisa a coluna em seu DataSet para o seu aplicativo, em seguida, removê-lo.
- Se você deseja que a coluna, mas não me importo de dar-lhe um valor, então alterá-lo para permitir DBNull.
- Você sempre pode desligar a aplicação da restrição (provavelmente uma má idéia): DataSet.EnforceConstraints = false
- Você poderia encher a coluna com uma chave substituta que não são enviados para o DB.
Para as duas primeiras opções, se você quiser a conveniência de deixar o designer manter sua estrutura em sincronia com seu banco de dados, então você pode remover a coluna ou permitir nulo programaticamente, talvez ao lado de uma "// Hack:" comentário explicando o porquê.
Outras dicas
Você está problably usando NEWID PADRÃO () em sua definição da tabela SQL Server de modo que o problema pode ser que o designer Dataset não vê esta coluna como auto-gerado.
Talvez gerando guid no código do aplicativo pode ser uma solução? Se não, então você pode definir o valor padrão em você Dataset, mas então você provavelmente também tem que mudar declarações DataAdapter insert / update para que esse valor padrão não se inseridos na tabela do SQL Server.
Há também poderia ser alguma outra solução que eu não estou ciente de ...