2011-03-11 11 views
11

Esta pregunta, hecha hace un año, es similar: Does the Entity Framework 4 support generators for id values like NHibernate?¿Entity Framework 4 Code First tiene soporte para generadores de identidad como NHibernate?

Pero lo que me gustaría saber es si el código de primera CTP añade soporte para las estrategias de generación de identidad. Si no, ¿alguien sabe un buen punto de extensión en EF para implementar algo similar?

Actualmente estoy trabajando con clases de modelo que usan GUID como identificador. Al insertar utilizando EF conservan sus valores iniciales Guid.Empty. Sé que puede establecer un valor predeterminado para la columna en el DB en newid(), pero eso anula el propósito de la generación de identidad del lado del cliente.

¿Entity Framework no está lo suficientemente maduro como para ser utilizado en un sistema distribuido, desconectado?

+0

Buena pregunta .. –

+4

ADO.NET Entity Framework 4.0 es un gran paso hacia adelante de 1,0, pero aún así es otra implementación de Microsoft a medio cocer. La extensibilidad apunta a pocos o ninguno. – Jeff

+1

@Jeff, aunque aprecio tu opinión (la mía es similar, prefiero NH), para este proyecto en particular no tengo el margen para usar otra cosa. – joshperry

Respuesta

16

No, el código de entidad Entity-code-first sigue siendo un buen envoltorio alrededor de EFv4. No hay generadores tipo NHibernate. Si desea un generador de Id del lado del cliente, deberá anular SaveChanges en el DbContext derivado e implementar su propia lógica para asignar Id. A nuevas entidades.

Editar:

Un poco de ejemplo nivel:

public class Context : DbContext 
{ 
    // Helper for example 
    // DO NOT USE IN REAL SCENARIOS!!! 
    private static int i = 0; 

    public DbSet<MyEntity> MyEntities { get; private set; } 

    public Context() 
     : base("connection") 
    { 
     MyEntities = Set<MyEntity>(); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<MyEntity>().HasKey(e => e.Id); 
     // Turn off autogeneration in database 
     modelBuilder.Entity<MyEntity>() 
        .Property(e => e.Id) 
        .HasDatabaseGeneratedOption(HasDatabaseGeneratedOption.None); 

     // Other mapping 
    } 

    public override int SaveChanges() 
    { 
     foreach (var entry in ChangeTracker.Entries<MyEntity>() 
      .Where(e => e.State == EntityState.Added)) 
     { 
      // Here you have to add some logic to generate Id 
      // I'm using just static field 
      entry.Entity.Id = ++i; 
     } 

     return base.SaveChanges(); 
    } 
} 

public class MyEntity 
{ 
    public int Id { get; set; } 
    // Other properties 
} 
+3

... que serían unas pocas líneas de código, las mejores. –

+0

Perfecto (para una solución), gracias Ladislav. – joshperry

+0

Suena interesante, ¿algún indicador sobre cómo implementarlo? (cómo obtener las nuevas entidades, cómo evitar que EF asigne los ID, etc.) –

6

mina Entity Framework 4.1.10715 instalado por NuGet. tal vez usted podría utilizar atribuyen

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int Id {get;set;} 

favor ver (La lista completa de las anotaciones soportados en EF 4.1: CTRL + F en la página) here.

-1
[Key] 
public string Id { get; set; } 

y luego utilice nueva ToString GUID

Units.Add(new Unit(){Id=Guid.NewGuid().ToString(), Name="123"}); 
Cuestiones relacionadas