117 votes

L'objet ne peut pas être supprimé car il n'a pas été trouvé dans la Vousmanager

J'obtiens ce message d'erreur "L'objet ne peut pas être supprimé car il n'a pas été trouvé dans la Vousmanager."

Mon code est:

    protected MyEntities sqlEntities;

    public virtual void Delete(TEntity entity)
    {
        System.Type t = typeof(TEntity);
        sqlEntities.DeleteObject(entity);
        sqlEntities.SaveChanges();
    }

160voto

Ladislav Mrnka Points 218632

Cela signifie que l'entité n'est pas attaché (il n'a pas été chargé par la même instance de contexte). Essayez ceci:

protected MyEntities sqlEntities;

public virtual void Delete(TEntity entity)
{
    sqlEntities.Attach(entity);
    sqlEntities.DeleteObject(entity);
    sqlEntities.SaveChanges();
}

63voto

Kjartan Points 5805

Juste une petite précision sur la réponse par Ladislav Mrnka (qui devrait être la accepté de répondre).

Si comme moi, vous avez un code dans un format comme ceci:

using (var context = new MyDataContext())
{
    context.MyTableEntity.Remove(EntytyToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

..alors ce que vous voulez faire:

using (var context = new MyDataContext())
{
    // Note: Attatch to the entity:
    context.MyTableEntity.Attach(EntityToRemove);

    context.MyTableEntity.Remove(EntityToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

Peut-être que cela semble évident, mais il n'était pas clair pour moi d'abord qu'il est nécessaire de spécifier l' entité à attatch, et pas seulement le contexte.

12voto

esbenr Points 316

Juste pour propergate sur Kjartans explication:

J'ai eu:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = GetProject(id);
            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }

Le problème est que j'ai utilisé mon propre méthode (GetProject()) pour obtenir l'entité (et donc un autre contexte, à charge de l'entité):

public Project GetProject(int id)
    {
        using (var context = new Context())
        {
            var project = context.Projects
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession)))
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room)))
                .SingleOrDefault(x => x.Id == id);
            return project;      
        }
    }

Une solution pourrait être de joindre le chargé de l'entité que Kjartan unis, un autre pourrait être le mien solution, à charge de l'entité, dans le même contexte:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = context.Projects.SingleOrDefault(x => x.Id == id);
            if (p == null)
                return p;

            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }

2voto

mehdi Points 6

vous pouvez écrire ce code:

var x=yourquery.FirstOrDefault(); 

sqlEntities.DeleteObject(x);
sqlEntities.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