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 la ID asignada de la entidad, si eliminamos un registro de la tabla, la identidad inicial no coincidirá con la ID de la entidad.
es bastante fácil Si está utilizando ID generados por DB (como IDENTITY en MS SQL), solo necesita agregar una entidad a ObjectSet y SaveChanges en ObjectContext relacionado. 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 la entidad de forma predeterminada sigue cada INSERT con SELECT SCOPE_IDENTITY() cuando se utilizan Id generados automáticamente.
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é que publicaría mis hallazgos aquí en- caso la gente busca "solucionar" el problema que tuve.
Considere un objeto 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 IdSin embargo, en mi caso, esto no era necesario porque tenía una relación de clave externa entre el cliente.Id y el pedido.Id del cliente
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 orderAhora, cuando guardo los cambios, la identificación que se genera para el cliente también se agrega al pedido. No necesito los pasos adicionales
Soy consciente de que esto no responde a la pregunta original, pero pensé que podría ayudar a los desarrolladores que son nuevos en EF a usar en exceso la respuesta más votada para algo que puede no ser necesario.
Esto también significa que las actualizaciones se completan en una sola transacción, lo que potencialmente evita los datos huérfanos (ya sea que se completen todas las actualizaciones o ninguna).
Debe volver a cargar la entidad después de guardar los cambios. Porque ha sido alterado por un activador de base de datos que EF no puede rastrear. Entonces, necesitamos volver a cargar la entidad desde la base de datos,
db.Entry(MyNewObject).GetDatabaseValues();Entonces
int id = myNewObject.Id;Mire la respuesta de @jayantha en la siguiente pregunta:
Mirar la respuesta de @christian en la siguiente pregunta también puede ayudar: