Cómo controlar los valores de clave principal al inicializar datos con el código de Entity Framework primero

StackOverflow https://stackoverflow.com//questions/12704519

Pregunta

Estoy creando un sitio asp.net mvc4 usando entidad framework 5 con codefirst y sql server express 2012.

He habilitado las migraciones y ahora hago esto en mi método Configuration.Seed:(tenga en cuenta que quiero establecer la clave principal 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 Modelo se define así:

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

Esto da como resultado una tabla en (SQL SERVER EXPRESS 2012) donde la columna Id tiene Identidad = verdadero, semilla de identidad = 1, incremento de identidad = 1.

Ahora, cuando ejecuto migraciones haciendo un PM> Update-Database este resultado en una fila con Id = 1.

Entonces mi pregunta es:

1) ¿Cómo puedo controlar los valores de las claves primarias incrementadas automáticamente al generar datos?

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

¿Fue útil?

Solución

Simplemente cree entidades ficticias con valores predeterminados, luego agregue sus datos reales y luego elimine las ficticias.No es la mejor manera pero supongo que no hay otra...

Otros consejos

¿Ha intentado agregar esto encima de su propiedad Id?

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

Parece que estás intentando frustrar el propósito de una columna de identidad.Si desea hacer esto, su única opción es utilizar comandos SQL. Establecer IDENTITY_INSERT para permitirle insertar el valor y luego ejecutar IDENTIFICADOR DE VERIFICACIÓN DBCC para actualizar la semilla.No es una muy buena idea.Estas opciones tienen limitaciones de seguridad y rendimiento.

Quizás quieras considerar usar un GUID en su lugar.Puede crear GUID en código que se garantiza que serán únicos 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 indexación.Este enfoque también es discutible.

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

Es muy complicado, pero me encontré con una situación en la que tuve que hacerlo debido a que algún informe tenía valores PK codificados.Arreglar los informes estaba 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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top