¿Cómo eliminar un conjunto de registros en el Marco de Entidades?

Tengo un modelo EF (y la tabla MSSQL correspondiente) "HCF".

Tengo otro modelo EF (y mesa MSSQL), "HCFNotes". No hay restricción de llave extranjera o ManyToOne: son sólo dos mesas separadas.

Tengo un ASP. Net Core Razor página que elimina el registro HCF así:

var HCF = await _context.HCF.FindAsync(id);
_context.HCF.Remove(HCF);
await _context.SaveChangesAsync();

Puedo conseguir una lista de las "notas asociadas" con este LINQ:

IQueryable notesQuery =
    from n in _context.HCReportingNotes 
    where n.HCFId == HCF.ID
    select n;

Puedo eliminar todas las notas asociadas en SQL crudo así:

delete from HCReportingNotes where ID = HCFId

Pero preferiría usar LINQ.

P: ¿Cuál es la sintaxis "correcta" .Select() la lista y .Remove() o .Clear() las notas asociadas?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por algorithmwhiz


4 Respuestas:

  • Ya que ya has conseguido la lista de notas asociadas, entonces utiliza RemoveRange sobre DbSet, eliminando cada elemento. Guardar cambios se puede aplicar después.

    //...
    
    var HCF = await _context.HCF.FindAsync(id);
    _context.HCF.Remove(HCF);
    
    IQueryable notesQuery =
        from n in _context.HCReportingNotes 
        where n.HCFId == HCF.ID
        select n;
    
     _context.HCReportingNotes.RemoveRange(notesQuery);
    
    await _context.SaveChangesAsync();
    
    //...
    

    Respondida el Dec 18, 2020 a las 22:43 - por techsavvypro

    Votos positivos: 0 | Votos negativos: 0

  • Si necesita eliminar grandes cantidades de elementos, recomendaría altamente este paquete nuget gratuito que hace tales cosas sin cargar entidades en la memoria: https://entityframework-plus.net/

    Con la respuesta aceptada cada elemento se cargará en la memoria que necesita ser eliminada.

    Descargo: No estoy afiliado con el paquete nuget. Ofrecen una versión pagada que hace aún más cosas.

    Respondida el Dec 18, 2020 a las 22:49 - por syntaxsniper

    Votos positivos: 0 | Votos negativos: 0

  • Para eliminar un conjunto de registros en Entity Framework Core, puedes hacer lo siguiente:

    • Obtén la lista de notas asociadas que deseas eliminar utilizando LINQ.
    • Recorre la lista de notas y elimínalas una por una.
    • Guarda los cambios en la base de datos.

    Aquí tienes un ejemplo de cómo podrías hacerlo:

    c

    IQueryable notesQuery =

    from n in _context.HCReportingNotes where n.HCFId == HCF.ID select n; List notesList = notesQuery.ToList(); foreach(var note in notesList) { _context.HCReportingNotes.Remove(note); } await _context.SaveChangesAsync();

    En este ejemplo, primero se realiza una consulta LINQ para obtener todas las notas asociadas al registro HCF que se está eliminando. Luego, se convierte el resultado de la consulta en una lista y se recorre esta lista para eliminar cada nota individualmente utilizando el método Remove() del contexto. Finalmente, se llama a SaveChangesAsync() para guardar los cambios en la base de datos.

    Con esto, deberías poder eliminar de forma efectiva todas las notas asociadas al registro HCF en la base de datos utilizando LINQ en Entity Framework Core.

    Respondida el Dec 19, 2020 a las 22:46 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para eliminar un conjunto de registros en Entity Framework Core, puedes utilizar el método RemoveRange() en el contexto del objeto. Aquí tienes un ejemplo de cómo eliminar todas las notas asociadas con un registro de HCF utilizando LINQ:

    csharp
    var notesToRemove = _context.HCReportingNotes.Where(n => n.HCFId == HCF.ID);
    _context.HCReportingNotes.RemoveRange(notesToRemove);
    await _context.SaveChangesAsync();
    

    El método RemoveRange() elimina todos los objetos especificados del conjunto de cambios. En este caso, elimina todos los objetos HCFNotes que están asociados con el registro de HCF que estás eliminando.

    También puedes utilizar el método Clear() para eliminar todos los objetos de una colección de navegación. Sin embargo, esto solo eliminará los objetos de la colección de navegación, no los eliminará de la base de datos.

    Ten en cuenta que estos cambios no se confirmarán en la base de datos hasta que llames al método SaveChangesAsync() en el contexto del objeto.

    Respondida el Dec 19, 2020 a las 22:48 - por Gemini

    Votos positivos: 0 | Votos negativos: 0