Para actualizar una entidad con Entity Framework Core, este es el proceso lógico:
- Crear instancia para
DbContext
clase
- Recuperar entidad por clave
- Realizar cambios en las propiedades de la entidad
- Guardar cambios
Update()
método en DbContext
:
Comienza a rastrear la entidad dada en el estado Modificado de modo que se actualizará en la base de datos cuando SaveChanges()
se llame.
El método de actualización no guarda los cambios en la base de datos; en su lugar, establece estados para las entradas en la instancia de DbContext.
Entonces, podemos invocar el Update()
método antes para guardar los cambios en la base de datos.
Asumiré algunas definiciones de objetos para responder a su pregunta:
El nombre de la base de datos es Store
El nombre de la tabla es Producto
Definición de clase de producto:
public class Product
{
public int? ProductID { get; set; }
public string ProductName { get; set; }
public string Description { get; set; }
public decimal? UnitPrice { get; set; }
}
Definición de la clase DbContext:
public class StoreDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Your Connection String");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(p => p.ProductID);
});
base.OnModelCreating(modelBuilder);
}
}
Lógica para actualizar entidad:
using (var context = new StoreDbContext())
{
var entity = context.Products.FirstOrDefault(item => item.ProductID == id);
if (entity != null)
{
entity.UnitPrice = 49.99m;
entity.Description = "Collector's edition";
context.SaveChanges();
}
}
int?
paraProductID
? ¿Se convierte en clave primaria opcional?Según documentos de Microsoft :
Sin embargo, debe saber que el uso del método Update en DbContext marcará todos los campos como modificados y los incluirá todos en la consulta. Si desea actualizar un subconjunto de campos, debe usar el método Adjuntar y luego marcar el campo deseado como modificado manualmente.
context.Attach(person); context.Entry(person).Property(p => p.Name).IsModified = true; context.SaveChanges();
fuente
context.Entry(person).Property(p => p.Name).IsModified = true;
context.Entry(person).State = EntityState.Modified;
_context.Attach(person).State = EntityState.Modified;
para indicar que esta entidad se actualizará en el método SaveChanges.fuente
Microsoft Docs nos ofrece dos enfoques.
Esta es la misma forma antigua que solíamos hacer en versiones anteriores de Entity Framework. y esto es lo que Microsoft nos recomienda.
Ventajas
Modified
en los campos que se modifican mediante la entrada del formulario.una alternativa es adjuntar una entidad creada por el enlazador de modelos al contexto EF y marcarla como modificada.
Como se mencionó en la otra respuesta, el enfoque de lectura primero requiere una lectura adicional de la base de datos y puede resultar en un código más complejo para manejar conflictos de concurrencia.
fuente
Es super simple
fuente
Después de revisar todas las respuestas, pensé que agregaría dos opciones simples
Si ya accedió al registro usando FirstOrDefault () con el seguimiento habilitado (sin usar la función .AsNoTracking (), ya que deshabilitará el seguimiento) y actualizó algunos campos, simplemente puede llamar a context.SaveChanges ()
En otro caso, ha publicado la entidad en el servidor utilizando HtppPost o ha desactivado el seguimiento por alguna razón, entonces debe llamar a context.Update (entityName) antes que context.SaveChanges ()
La primera opción solo actualizará los campos que cambió, pero la segunda opción actualizará todos los campos de la base de datos, aunque ninguno de los valores de campo se actualizó realmente :)
fuente
Un enfoque más genérico
Para simplificar este enfoque se utiliza una interfaz "id"
El método de ayuda
Uso
fuente