¿Cómo puedo recuperar la identificación de la entidad insertada usando Entity framework?
Tengo un problema con Entity Framework en ASP.NET. Quiero obtener el valor de Id cada vez que agrego un objeto a la base de datos. ¿Cómo puedo hacer esto?
Según Entity Framework la solución es:
using (var context = new EntityContext())
{
var customer = new Customer()
{
Name = "John"
};
context.Customers.Add(customer);
context.SaveChanges();
int id = customer.CustomerID;
}
Esto no obtiene la identidad de la tabla de la base de datos, pero obtiene el ID asignado de la entidad; si eliminamos un registro de la tabla, la identidad inicial no coincidirá con el ID de la entidad.
Es bastante fácil. Si está utilizando identificadores generados por bases de datos (como IDENTITY
en MS SQL), solo necesita agregar una entidad dentro ObjectSet
y SaveChanges
fuera de los archivos relacionados ObjectContext
. Id
se completará automáticamente para usted:
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
El marco de entidad de forma predeterminada sigue a cada uno INSERT
cuando se utilizan mensajes de correo SELECT SCOPE_IDENTITY()
electrónico generados automáticamente .Id
Había estado usando la respuesta de Ladislav Mrnka para recuperar con éxito los ID cuando usaba Entity Framework; sin embargo, estoy publicando aquí porque lo había estado usando mal (es decir, usándolo donde no era necesario) y pensé en publicar mis hallazgos aquí en- caso la gente busca "resolver" el problema que tuve.
Considere un objeto de Pedido que tiene una relación de clave externa con el Cliente. Cuando agregué un nuevo cliente y un nuevo pedido al mismo tiempo estaba haciendo algo como esto;
var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id
Sin embargo, en mi caso esto no fue necesario porque tenía una relación de clave externa entre customer.Id y order.CustomerId.
Todo lo que tenía que hacer era esto;
var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer};
context.Orders.Add(order);
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
Ahora, cuando guardo los cambios, la identificación que se genera para el cliente también se agrega al pedido. No necesito pasos adicionales
Soy consciente de que esto no responde a la pregunta original, pero pensé que podría ayudar a los desarrolladores nuevos en EF a no utilizar en exceso la respuesta más votada para algo que quizás no sea necesario.
Esto también significa que las actualizaciones se completan en una sola transacción, lo que potencialmente evita datos huérfanos (ya sea que se completen todas las actualizaciones o ninguna).