6

ich eine asp.net mvc4 Website erschaffe in Meine Configuration.Seed-Methode: (beachten Sie, dass ich den Primärschlüssel auf 8 festlegen möchten, obwohl dies der erste Datensatz in der Datenbank ist).Wie Primärschlüsselwerte steuern, wenn mit Entity Framework Impfen Daten codefirst

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

My Model-Objekt wird wie folgt definiert:

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

Dies in einer Tabelle führt (SQL Server Express 2012), wo die ID-Spalte Identität = true hat, Identität Samen = 1, Identität Schritt = 1.

Nun, wenn ich Migrationen laufen durch ein PM> Update-Database dieses Ergebnis in einer Reihe mit Id = 1.

Also meine Frage tun:

1) Wie kann ich beim Seeding die Werte von automatisch inkrementierten Primärschlüsseln steuern?

2) Wenn die Lösung den Schlüsselspalten-Startwert erhöhen soll, wie soll dies geschehen, wenn ich Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>()); verwende. Dadurch wird die Datenbank jedes Mal neu aufgebaut und neu erstellt, wenn ich die Datenbank aktualisiere. Wie würde also der Startwert in der neuen Datenbank aktualisiert?

Antwort

2

Erstellen Sie einfach Dummy-Einheiten mit Standardwerten, dann Ihre realen Daten hinzufügen und danach die Attrappen löschen. Nicht der beste Weg, aber ich denke, es gibt keinen anderen ...

+0

Ja, das war es, was ich getan habe. –

0

Es scheint, dass Sie versuchen, den Zweck einer Identitätsspalte zu besiegen. Wenn Sie dies tun möchten, verwenden Sie nur die SQL-Befehle Set IDENTITY_INSERT, damit Sie den Wert eingeben können, und führen Sie dann DBCC CHECKIDENT aus, um den Seed zu aktualisieren. Keine wirklich gute Idee. Diese Optionen haben Sicherheits- und Leistungseinschränkungen.

Sie können stattdessen die Verwendung einer GUID in Betracht ziehen. Sie können GUIDs in Code erstellen, die garantiert eindeutig sind, und Sie können GUIDs in SQL auch als Spaltenstandard generieren.

Mit GUIDs, die nicht sequentiell sind, müssen Sie eine gute Indexierungsstrategie durchdenken. Dieser Ansatz ist ebenfalls umstritten.

Letztendlich sieht es so aus, als ob Sie eine andere Strategie als die Verwendung einer Identitätsspalte benötigen.

+0

Ich möchte die Id kontrollieren, weil ich Daten am Migration von einer MySQL-Datenbank auf SQL Server –

1

Haben Sie auf Hinzufügen dieser Ihrer Id-Eigenschaft versucht:

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

nicht, aber das wird helpt mich nicht, weil ich noch Identität verwenden möchten (Autoinkrement), ich möchte nur zu Beginnen Sie bei einem anderen Startwert als 0. –

0

Es ist sehr hackish, aber ich rannte in ein Szenario, wo ich es aufgrund einiger Berichte mit fest codierten PK-Werten tun musste. Das Reparieren der Berichte lag außerhalb meines Aufgabenbereichs.

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