6

estoy creando un sitio asp.net utilizando mvc4 marco de la entidad con 5 codefirst y el servidor SQL Express 2012.Cómo controlar los valores de clave principal cuando la siembra de datos con Entity Framework codefirst

He permitido migraciones y ahora hacer esto en mi método Configuration.Seed: (tenga en cuenta que quiero establecer la clave primaria en 8 aunque este sea el primer registro en la base de datos).

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

Mi objeto de Model se define así:

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

Esto se traduce en una mesa en (SQL Server Express 2012), donde la columna de Id tiene Identidad = true, semilla de Identidad = 1, incremento de identidad = 1.

Ahora en que funciono migraciones haciendo una PM> Update-Database este resultado en una fila con Id = 1.

Así que mi pregunta es:

1) ¿Cómo puedo controlar los valores de las claves primarias autoincorporadas al sembrar datos?

2) Si la solución es incrementar el valor de inicialización de las columnas clave, ¿cómo se hace cuando estoy usando Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());? Esto nukeará y reconstruirá la base de datos cada vez que actualizo la base de datos, entonces, ¿cómo se actualizaría el valor inicial en la nueva base de datos?

Respuesta

2

Basta con crear entidades ficticias con valores por defecto, a continuación, añadir sus datos reales y después eliminar los maniquíes. No es la mejor manera, pero supongo que no hay otra ...

+0

sí, eso fue lo que terminé haciendo. –

0

Parece que está tratando de vencer el propósito de una columna de identidad. Si desea hacer esto, su única opción es usar los comandos SQL Set IDENTITY_INSERT para permitirle insertar el valor y luego ejecutar DBCC CHECKIDENT para actualizar la semilla. No es una buena idea. Estas opciones tienen limitaciones de seguridad y rendimiento.

Es posible que desee considerar el uso de un GUID en su lugar. Puede crear GUID en un código que garantice que es único, y también puede generar GUID en SQL como columna predeterminada.

Con los GUID, que no son secuenciales, deberá pensar en una buena estrategia de indización. Este enfoque también es discutible.

En última instancia, parece que necesita una estrategia diferente a la de usar una columna de identidad.

+0

Quiero controlar el Ello porque estoy migración de datos desde una base de datos MySQL a SQL Server –

1

Ha intentado añadir esta en la parte superior de su propiedad Id:

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

no, pero esto no me va a Helpt, porque todavía quiero usar Identidad (incremento automático), sólo quiero comenzar en otra semilla que no sea 0. –

0

Es muy hackish, pero me encontré con un escenario en el que tuve que hacerlo debido a que algunos informes tenían valores PK codificados. Reparar los informes fue más allá de mi alcance de trabajo.

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