6

sto creando un sito asp.net mvc4 utilizzando Entity Framework 5 con codefirst e il server SQL Express 2012.Come controllare valori di chiave primaria quando si semina dati con Entity Framework codefirst

Ho permesso migrazioni e ora farlo in il mio metodo Configuration.Seed: (nota che voglio impostare la chiave primaria su 8 anche se questo è il primo record nel database).

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

mio oggetto del modello è definita in questo modo:

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

Questo si traduce in una tabella in (SQL Server Express 2012) in cui la colonna Id ha Identità = true, semi di Identità = 1, incremento identità = 1.

Ora, quando corro migrazioni facendo una PM> Update-Database questo risultato in una riga con id = 1.

Quindi la mia domanda è:

1) Come posso controllare i valori delle chiavi primarie auto-incrementate quando si seminano i dati.

2) Se la soluzione consiste nell'incrementare il valore di inizializzazione delle colonne chiave, come procedere quando si utilizza Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());. Ciò nuke e ricostruisce il database ogni volta che aggiorno il database, quindi come dovrebbe essere aggiornato il valore del seme nel nuovo database?

risposta

2

basta creare entità fittizie con valori di default, quindi aggiungere i dati reali e poi eliminare i manichini. Non è il modo migliore, ma suppongo che non ci sia altro ...

+0

sì, era quello che ho finito per fare. –

0

Sembra che tu stia cercando di sconfiggere lo scopo di una colonna di identità. Se si desidera eseguire questa operazione, l'unica scelta possibile è utilizzare i comandi SQL Set IDENTITY_INSERT per consentire all'utente di inserire il valore e quindi eseguire DBCC CHECKIDENT per aggiornare il seme. Non è davvero una buona idea. Queste opzioni hanno limiti di sicurezza e prestazioni.

Si consiglia di prendere in considerazione l'utilizzo di un GUID. È possibile creare GUID in codice che sono garantiti come univoci e inoltre è possibile generare GUID in SQL come impostazione predefinita della colonna.

Con GUID, che non sono sequenziali, è necessario pensare a una buona strategia di indicizzazione. Questo approccio è anche discutibile.

In definitiva, sembra che sia necessaria una strategia diversa dall'utilizzo di una colonna Identity.

+0

Voglio controllare l'Id perché sono la migrazione dei dati da un database MySQL a SQL Server –

1

Hai provato l'aggiunta di questo in cima alla vostra proprietà Id:

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

no, ma questo non mi voglio Helpt, perché ho ancora voglia di utilizzare Identity (incremento automatico), voglio solo iniziare con un altro seme diverso da 0. –

0

È molto hacker, ma mi sono imbattuto in uno scenario in cui dovevo farlo a causa di alcuni rapporti con valori PK hardcoded. La risoluzione dei rapporti era al di fuori del mio ambito di lavoro.

Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " + 
    "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " + 
    "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF"); 
Problemi correlati