Código do Entity Framework Primeiras Migrações: Definir Valor da Chave Primária
Eu tenho uma tabela que armazena alguns dados extras para algumas linhas de uma tabela como:
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
// More fields here
}
Eu gostaria de poder adicionar linhas a esta tabela onde eu defino explicitamente o PK.
Se eu simplesmente deixar como acima, definir um valor e enviar a linha faz com que o valor seja descartado e substituído pelo valor gerado automaticamente do banco de dados (e a coluna é definida como uma coluna Identity no esquema real).
Esta parece ser a solução certa:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
// More fields here
}
No entanto, isso me faz a exceção:
Não é possível inserir um valor explícito para a coluna de identidade na tabela 'EnumTest' quando IDENTITY_INSERT está definido como OFF.
Então, como eu escrevo minha classe para poder definir o valor de uma chave primária no EF?
Editar:
Eu tentei adicionar a seguinte migração baseada em código para definir IDENTITY_INSERT como ON:
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
Eu corri e tentei novamente, mas recebi a mesma exceção acima. O que é estranho é que o banco de dados reflete essa configuração, e executar o SQL diretamente nele permite inserir valores arbitrários na chave primária - assim, parece que o próprio Entity Framework está impondo essa regra e não reconhece que IDENTITY_INSERT não está em fato desativado. Eu preciso configurá-lo em algum lugar da própria EF?
Editar 2:
Eu não entendi IDENTITY_INSERT; Eu assumi que defini-lo uma vez deixei-o nessa mesa indefinidamente. Na verdade, ela dura tanto quanto a "Sessão", o que significa que, por exemplo, configurá-la em uma migração significa que ela existe ... contanto que a migração seja executada e não tenha relação com conexões futuras como a minha .Add () com EF , o que explica porque eu ainda tenho essa exceção - o DB realmente é a fonte da exceção, não da EF. Como IDENTITY_INSERT é limitado a no máximo uma tabela por sessão, é uma maneira bastante ineficiente de fazer isso - não criar uma coluna Identity PK parece ser uma rota melhor.