Confusión de Entity Framework Adjuntar/Actualizar (EF Core)

Confusión de Entity Framework Adjuntar/Actualizar (EF Core)

Considere el siguiente código:

students entity = new students() {
    Id = 1,
    City = "New York",
    Name = "Sam"
};
using(SomeContext ctx = new SomeContext())
{
    ctx.Entry(entity).State = EntityState.Modified;
    ctx.SaveChanges();
}

Suponiendo que tenemos un registro con id =1 en la base de datos, el código anterior actualizará esa entidad en la base de datos.

Attach se utiliza cuando sabe que una entidad ya existe en la base de datos pero desea realizar algunos cambios mientras cambia el estado a modificado cuando ya ha realizado los cambios.


En el siguiente ejemplo, el contexto obtiene la entidad, por lo que el contexto comienza a rastrearla de inmediato. Cuando modifica valores de propiedad en una entidad rastreada, el contexto cambia el EntityState para la entidad a Modified y ChangeTracker registra los valores de propiedad antiguos y los valores de propiedad nuevos. Cuando se llama a SaveChanges, la base de datos genera y ejecuta una instrucción UPDATE.

var author = context.Authors.First(a => a.AuthorId == 1);
author.FirstName = "Bill";
context.SaveChanges();

Dado que ChangeTracker rastrea qué propiedades se han modificado, el contexto emitirá una instrucción SQL que actualiza solo las propiedades que se cambiaron:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Authors] SET [FirstName] = @p0
WHERE [AuthorId] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 nvarchar(4000)',@p1=1,@p0=N'Bill'

Actualización de DbContext

La clase DbContext proporciona métodos Update y UpdateRange para trabajar con entidades individuales o múltiples.

public void Save(Author author)
{
    context.Update(author);
    context.SaveChanges();
}

Al igual que con la configuración del Estado de la entidad, este método da como resultado que el contexto realice un seguimiento de la entidad como Modificada. Una vez más, el contexto no tiene forma de identificar qué valores de propiedad se han cambiado y generará SQL para actualizar todas las propiedades. Donde este método difiere de establecer explícitamente la propiedad Estado, es en el hecho de que el contexto comenzará a rastrear cualquier entidad relacionada (como una colección de libros en este ejemplo) en el estado Modificado, lo que dará como resultado que se generen declaraciones de ACTUALIZACIÓN para cada una de ellas. . Si la entidad relacionada no tiene un valor de clave asignado, se marcará como Agregado y se generará una instrucción INSERT.

Adjuntar DBContext

Cuando usa el método Adjuntar en una entidad, su estado se establecerá en Sin cambios, lo que dará como resultado que no se generen comandos de base de datos en absoluto. Todas las demás entidades accesibles con valores clave definidos también se establecerán en Sin cambios. Los que no tengan valores clave se marcarán como Agregados. Sin embargo, ahora que la entidad está siendo rastreada por el contexto, puede informar al contexto qué propiedades se modificaron para que se genere el SQL correcto para actualizar solo esos valores:

var context = new TestContext();
var author = new Author {
    AuthorId = 1,
    FirstName = "William",
    LastName = "Shakespeare"
};
author.Books.Add(new Book {BookId = 1, Title = "Othello" });
context.Attach(author);
context.Entry(author).Property("FirstName").IsModified = true;
context.SaveChanges();

El código anterior hará que la entidad del autor se marque como Modificada y se genere SQL para actualizar solo la propiedad FirstName:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Authors] SET [FirstName] = @p0
WHERE [AuthorId] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 nvarchar(4000)',@p1=1,@p0=N'William'

Referencia:Leer más