2011-04-13 14 views
9

Me gustaría implementar soporte de generación de Id "predeterminado" para mis entidades.Asignación de identificadores a entidades con EntityFramework 4

Al guardar la entidad, me gustaría que EntityFramework solo genere el valor de id para la entidad si no está ya configurado. Si el ID ya tiene un valor no nulo, distinto de cero, quiero conservar ese ID de entidad cuando la entidad se guarde en la base de datos.

Estoy migrando datos de un modelo de datos heredado (modelo EntityFramework creado a partir de la base de datos anterior) a un modelo EntityFramework recién creado (primer modelo). Llamemos al viejo modelo A, y al nuevo modelo T.

Normalmente, quisiera que las entidades T tuvieran sus ID configurados al guardar (todos son int64), para el uso a largo plazo del nuevo modelo .

Actualmente, estoy asignando explícitamente Id. De entidades T en función del ID de la entidad A correspondiente desde la que estoy migrando. Esto es para que los resultados de la migración sean fáciles de verificar.

Sin embargo, aunque puedo asignar el ID de una entidad T al mismo ID que la entidad A en mi rutina de migración, después de guardar las entidades, los valores Id han cambiado.

¿Hay alguna manera de anular el método de guardado predeterminado para todas las entidades en el modelo T, por lo que el valor del id solo se asigna si no está establecido en la entidad antes de guardarse?

He examinado algunas de las otras preguntas de EntityFramework/Id aquí, pero a mi parecer ninguno de ellos me pregunta lo mismo.

Gracias por cualquier pista.

Respuesta

3

Veo que mencionó que está utilizando Model First. Sin embargo, tengo una muestra de Code First que puede ser de alguna ayuda.

En la entidad T, tiene un atributo [Key] en la propiedad id, ¿no? De ser así, puede usar otro atributo, DatabaseGeneratedAttribute, para forzar que se establezca la identidad.

public class SomeEntity 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int? SomeEntityID { get; set; } 
} 

Además, hay una llamada a la API Fluido para lograr un resultado similar:

public class YourContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder dbModelBuilder) 
    { 
     base.OnModelCreating(dbModelBuilder); 

     var config = dbModelBuilder.Entity<SomeEntity>(); 
     config.Property(e => e.SomeEntityID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    } 
} 
+0

Gracias por la respuesta, Ed. ¿Quiere decir "forzar que NO se establezca la identidad" en la base de datos? Si es así, el modelo de generación se puede establecer en el atributo para que la entidad ya deshabilite completamente la generación de ID en la base de datos. Lo que estoy buscando es algo que asignará la identidad automáticamente en la base de datos si aún no está asignada. IOW, una asignación condicional o predeterminada. –

+0

El código anterior obligará a la tecla a no establecerse. Parece que no es lo que estás buscando.No sé nada de lo que EF puede hacer para ayudarte. –

+0

Gracias de nuevo por su respuesta, Ed. Creo que tal vez podría utilizar esta técnica para el escenario en el que tengo que realizar la migración de datos y asignar explícitamente las claves colocando la clase parcial en el código de migración, y luego permitir que EF genere la clave en la nueva aplicación de producción. Voy a votar mejor su respuesta, pero no la seleccionaré como * la * porque todavía me gustaría obtener el comportamiento descrito en mi pregunta. –

3

Después de la búsqueda continua, la lectura y las discusiones con algunos amigos que saben más sobre EF de lo que actualmente hago, Creo que la única forma práctica y sostenible de lograr lo que estoy buscando con la implementación actual de Entity Framework es crear un proveedor personalizado de Entity Framework, como se analiza en this blog post.

Si tendré tiempo para implementar esto es algo que tendré que resolver, pero pensé que al menos terminaría esta respuesta. Un proveedor personalizado también permitiría implementar un descifrado en lectura/encriptación en atributos de escritura para las entidades también.

Sin embargo, estas características son las dos cosas que espero ver cocidas en una versión futura de EntityFramework.

Cuestiones relacionadas