2010-08-23 11 views
8

Todas mis entidades tienen Id de propiedad. Todas mis tablas en la base de datos tienen ID de identidad entero generado automáticamente como clave principal.Repositorio genérico de EF obtener Id de entidad genérica nueva insertada

Tengo un método genérico para crear entidades.

¿Hay alguna manera de obtener Id entidad después de la entidad insertada en la base de datos?

public override int Create<T>(T entity) 
    { 
     string entitySet = GetEntitySetName<T>(); 
     _context.AddObject(entitySet, entity); 
     _context.SaveChanges(); 

     return <Id Here>; //TODO Return Id here 
    } 

En repositorio sencilla (no genérico) i puede simplemente volver Entity.Id, pero la forma de conseguir el mismo comportamiento en el repositorio genérico? Es posible que tenga una clase de entidad base para todas las entidades que contengan identificador de propiedad int, pero ¿hay alguna forma de que funcione sin implementar esta herencia?

Respuesta

3

La solución:

public override TR Create<T, TR>(T entity) 
    { 
     string entitySet = GetEntitySetName<T>(); 
     _context.AddObject(entitySet, entity); 
     _context.SaveChanges(); 

     //Returns primaryKey value 
     return (TR)context.CreateEntityKey(entitySet, entity).EntityKeyValues[0].Value;      
    } 

Donde T: tipo de entidad, TR: entidad tipo PK.

+0

¿Es posible obtener la identificación antes de llamar a savechanges? – Jeroen

+0

@Jeroen Hay dos maneras de hacerlo: si desea utilizar int como PK en ese caso, primero debe insertar un registro vacío para obtener un nuevo ID generado por la base de datos, de lo contrario puede usar Guid como PK, en ese caso puede generar PK's directamente en su código llamando a Guid.NewGuid() – Kuncevic

+0

por favor muestre cómo llamar a la función 'Create()' que devolverá el valor de PK. gracias –

4

Con entidades POCO, debe usar una interfaz, reflejo, o dynamic.

Con las entidades EntityObject puede leer la propiedad EntityKey.

+0

Gracias, la interfaz es la mejor manera, pero temporal voy a ir con la dinámica. 'dynamic currentEntity = entity;' 'return currentEntity.Id;' – Kuncevic

16

Esto puede ser realmente simple;

// Project is is object/table, no POCO here. 

var newProj = new Project(); 
newProj.Name = "Blah project"; 

var db = new AppDataContextname(); 

db.Projects.AddObject(newProj); 

// at this point, newProj.ID is NOT set 

db.SaveChanges(); // record is added to db. 
// now, the ID property of the Project object is set!!! 

// if the last ID in that table is '25', and you have auto-increment, 
// then the object's ID property will now be 26! 
Console.WriteLine(newProj.ID); // will output "26" 

Me volví loco sobre cómo recuperar la ID por un tiempo prolongado hasta que me di cuenta de que el código anterior funciona. Funciona en Linq-To-SQL y EF4.

1
With reflection you can obtain the Id property. 


public override int Create<T>(T entity) 
    { 
     string entitySet = GetEntitySetName<T>(); 
     _context.AddObject(entitySet, entity); 
     _context.SaveChanges(); 

     var idProperty = item.GetType().GetProperty("Id").GetValue(entity,null); 
     return (int)idProperty; 
    } 
+0

Esto funciona, pero puede ser un rendimiento de arrastre ... la reflexión es lenta (muchos discuten). –

Cuestiones relacionadas