web-dev-qa-db-fra.com

Manière correcte de supprimer l'enregistrement dans LINQ to Entities

J'ai juste une situation très simple où tout ce dont j'ai besoin est de supprimer l'enregistrement à l'aide de Linq2Entities. J'ai essayé de faire des recherches et je n'arrive toujours pas à trouver le bon moyen de le faire.

Voici mon code simple:

[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
    using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
                 where  y.EmployeeId == z.EmployeeId
                 select y).FirstOrDefault();
         ctx.DeleteObject(x);
         ctx.SaveChanges();
    }
 }

[DataObjectMethod(DataObjectMethodType.Select)]
public List<Employee> GetAllEmployee()
{
    using (var ctx = new MyEntity())
    {
        var x = from y in ctx.Employees
                select y;
        return x.ToList();
    }
}

Je peux supprimer un enregistrement particulier si, par exemple, j'assigne y.EmployeeName == "Harold Javier" à la méthode Delete ci-dessus, mais lorsque j'assigne y.EmployeeId == z.EmployeeId au code ci-dessus. , la suppression ne fonctionne pas. (Remarque: EmployeeId est la clé primaire de la table Employee)

11
Harold Javier

J'ai décidé de répondre à ma propre question.

Ma fonction de suppression a fonctionné lorsque j'ai effectué les tâches suivantes:

using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
             orderby  y.EmployeeId descending
             select y).FirstOrDefault();
        ctx.Employees.DeleteObject(x);
        ctx.SaveChanges();
    }

Je sais qu'il pourrait y avoir une meilleure approche que cela, mais cela fonctionne pour moi pour le moment.

4
Harold Javier

Je pense que c'est la meilleure option de supprimer

using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
             orderby  y.EmployeeId descending
             select y).FirstOrDefault();
        ctx.Employees.Remove(x);
        ctx.SaveChanges();
    }

à mes côtés DeleteObject ne fonctionne pas alors j'utilise Remove

12
Sanket Gandhi

vous devez d’abord vérifier que si un enregistrement existe avant de le supprimer réellement;

[DataObjectMethod(DataObjectMethodType.Delete)]

    public void DeleteEmployee(Employee z)
    {
        using (var ctx = new MyEntity())
        {
            var x = (from y in ctx.Employees
                     where  y.EmployeeId == z.EmployeeId
                     select y).FirstOrDefault();
             if(x!=null)
             {
             ctx.Employees.DeleteObject(x);
             ctx.SaveChanges();
             }
        }
     }

Vérifiez toujours les valeurs NULL avant de supprimer quelque chose. Parce qu'un utilisateur peut changer l'ID (à la chaîne de requête) et essayer différentes combinaisons.

5
DotNet Dreamer

La réponse ci-dessus est peut-être obsolète ... La méthode DeleteObject ne semble pas exister dans la version actuelle de ENtity Framework. Je devais utiliser la méthode Remove. 

var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
3
Scooter

@ Harold, je sais que ce message est assez ancien, mais j'estime qu'il est important de répondre à votre question initiale. Votre solution a peut-être fonctionné dans votre situation, mais il existe quelques problèmes.

Tout d'abord, votre code d'origine consistait à sélectionner l'enregistrement à supprimer en fonction d'un paramètre passé. Votre solution supprime l'enregistrement avec le plus grand EmployeeId. C’est peut-être ce que vous souhaitez, mais peu probable… .. Le deuxième problème est que deux accès à la base de données sont nécessaires pour effectuer la suppression. Le premier consiste à demander à l'entité de supprimer le second pour effectuer la suppression.

L'extrait de code suivant éliminera le besoin de lire et supprimera l'employé "z". Cela devrait donner le résultat souhaité et donner de bien meilleurs résultats.

public void DeleteEmployeeId(Employee z)
{
    using (var ctx = new MyEntityContext())  
    {  
        var x = new Employee{ EmployeeId = z.EmployeeId };
        ctx.Entry(x).State = EntityState.Deleted;  
        ctx.SaveChanges();  
    }
}
2
Jim Reineri

Ceci est probablement dû au fait que le contexte est différent à chaque demande (var ctx = new MyEntity ()). Essayez d'utiliser ceci

public static class ObjectContextPerHttpRequest
{
    public static TestCasesModelContainer Context
    {
        get
        {
            string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest");

            if (!HttpContext.Current.Items.Contains(objectContextKey))
            {
                HttpContext.Current.Items.Add(objectContextKey, new TestCasesModelContainer());
            }

            return HttpContext.Current.Items[objectContextKey] as TestCasesModelContainer;
        }
    }
}

Et supprimer est comme 

public static void Delete(Testcase tc)
{
    var db = ObjectContextPerHttpRequest.Context;

    db.DeleteObject((from p in db.TestcaseSet
                     where p.Id == tc.Id
                     select p).Single());
    db.SaveChanges();
}
1
Janne Matikainen