231 votes

Supprimer un seul enregistrement d'Entity Framework ?

J'ai une table SQL Server dans Entity Framework nommée employ avec une seule colonne clé nommée ID .

Comment supprimer un seul enregistrement de la table en utilisant Entity Framework ?

4voto

valentasm Points 340

Plus d'approbation générique

public virtual void Delete<T>(int id) where T : BaseEntity, new()
{
    T instance = Activator.CreateInstance<T>();
    instance.Id = id;
    if (dbContext.Entry<T>(entity).State == EntityState.Detached)
    {
        dbContext.Set<T>().Attach(entity);
    }

    dbContext.Set<T>().Remove(entity);
}

3voto

LatentDenis Points 1249

Je voulais juste vous faire part des trois méthodes avec lesquelles j'ai rebondi.

Méthode 1 :

var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();

Méthode 2 :

var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;

L'une des raisons pour lesquelles je préfère opter pour Méthode 2 c'est parce que dans le cas d'un réglage de EF ou EFCore sur QueryTrackingBehavior.NoTracking c'est plus sûr de le faire.

Ensuite, il y a Méthode 3 :

var record = ctx.Records.FirstOrDefault();
var entry = ctx.Entry(record);
record.DeletedOn = DateTimeOffset.Now;
entry.State = EntityState.Modified;
ctx.SaveChanges();
entry.State = EntityState.Detached;

Cette méthode utilise une approche de suppression douce en fixant la valeur de l'enregistrement. DeletedOn tout en étant capable de conserver l'enregistrement pour une utilisation future, quelle qu'elle soit. En gros, le mettre dans la corbeille .


En outre, en ce qui concerne Méthode 3 au lieu de faire en sorte que l'enregistrement entier soit modifié :

entry.State = EntityState.Modified;

Vous pouvez aussi simplement définir uniquement la colonne DeletedOn tel que modifié :

entry.Property(x => x.DeletedOn).IsModified = true;

2voto

Gizmo Points 31

Avec Entity Framework 6, vous pouvez utiliser Remove . C'est aussi une bonne tactique à utiliser. using pour être sûr que votre connexion est fermée.

using (var context = new EmployDbContext())
{
    Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
    context.Employ.Remove(emp);
    context.SaveChanges();
}

0voto

Namroy Points 1
    [HttpPost]
    public JsonResult DeleteCotnact(int id)
    {
        using (MycasedbEntities dbde = new MycasedbEntities())
        {
            Contact rowcontact = (from c in dbde.Contact
                                     where c.Id == id
                                     select c).FirstOrDefault();

            dbde.Contact.Remove(rowcontact);
            dbde.SaveChanges();

            return Json(id);
        }
    }

Que pensez-vous de cela, simple ou pas, vous pouvez aussi essayer ceci :

        var productrow = cnn.Product.Find(id);
        cnn.Product.Remove(productrow);
        cnn.SaveChanges();

0voto

Tom Trnka Points 1

Pour un DAO générique, cela a fonctionné :

    public void Delete(T entity)
    {
        db.Entry(entity).State = EntityState.Deleted;
        db.SaveChanges();
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X