Pergunta

Estou criando um asp.net mvc4 site usando o entity framework 5 com codefirst e o sql server express 2012.

Eu tenho habilitado migrações e agora esta na minha Configuração.Semente método:(note que eu quero para definir a chave primária de 8, mesmo que este é o primeiro registro no banco de dados).

context.ProductCategoryDtoes.AddOrUpdate(x => x.Id,
    new ProductCategoryDto() { Id = 8, Name = "category1" }
);

O meu Modelo de objeto é definido assim:

[Table("ProductCategory")]
public class ProductCategoryDto {
    public long Id { get; set; }
    public string Name { get; set; }
}

Isso resulta em uma tabela no SQL SERVER EXPRESS 2012), onde a coluna de Identificação de Identidades = true, Identidade seed = 1, identidade incremento = 1.

Agora, quando eu executar migrações fazendo um PM> Update-Database este resultado em uma linha com o Id = 1.

Então, minha pergunta são:

1) Como posso controlar os valores de auto incrementado chaves primárias quando a propagação de dados.

2) Se a solução é incrementar as colunas de chave valor da semente, então, como é que isso seja feito quando eu estou usando Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());.Isto irá nuke e reconstruir o banco de dados toda vez que eu atualizar o banco de dados, assim como a semente valor ser atualizado no novo banco de dados?

Foi útil?

Solução

Basta criar fictício entidades com valores padrão e, em seguida, adicionar os seus dados reais e, em seguida, eliminar os manequins.Não é a melhor maneira, mas eu acho que não há outro...

Outras dicas

Você já tentou adicionar esta no topo de sua propriedade Id:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }

Parece que você está tentando derrotar o propósito de uma coluna de identidade.Se você quiser fazer isso, sua única opção é usar Comandos SQL Set IDENTITY_INSERT para permitir que você insira o valor e, em seguida, executar DBCC CHECKIDENT para atualizar a semente.Não é realmente uma boa idéia.Essas opções de segurança e limitações de desempenho.

Você pode querer considerar o uso de um GUID em vez disso.Você pode criar GUIDs de código que são garantidos para ser único, e você também pode gerar GUIDs em SQL como uma coluna padrão.

Com o Guid, não são sequenciais, você terá que pensar através de uma boa estratégia de indexação.Esta abordagem também é discutível.

Em última análise, parece que você precisa de uma estratégia diferente de outros do que usando uma Coluna de Identidade.

É muito hackish, mas eu me deparei com um cenário em que eu tinha que fazer isso devido a alguns relatam ter codificado PK valores.Fixação de relatórios era fora do meu escopo de trabalho.

Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " +
     "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " +
     "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top