2013-03-18 1 views
10

J'ai juste une situation très simple où tout ce dont j'ai besoin est de supprimer l'enregistrement en utilisant Linq2Entities. J'ai essayé de faire des recherches et je n'arrive toujours pas à trouver la bonne façon de le faire.Un bon moyen de supprimer l'enregistrement dans LINQ aux entités

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'attribue y.EmployeeName == "Harold Javier" à la méthode Delete ci-dessus, mais quand j'attribue y .EmployeeId == z.EmployeeId au code ci-dessus, la suppression ne fonctionne pas. (Remarque: EmployeeId est la clé primaire de la table Employé)

+3

Quel est le problème avec votre code? Des erreurs?postez-les si c'est le cas. –

+0

Nous pouvons compiler le code et cela semble correct. Mais lorsque nous l'utilisons avec ObjectDataSource (WebForm ASP.NET), le bouton Supprimer ne fonctionne pas. –

+0

Essayez 'ctx.Employees.DeleteOnSubmit (x)' au lieu de 'ctx.DeleteObject (x)' – MarcinJuraszek

Répondre

3

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

Ma fonction de suppression travaillé quand je l'ai fait ce qui suit:

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 il travaille pour moi-temps.

5

vous devez d'abord vérifier 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(); 
      } 
     } 
    } 

Toujours vérifier les valeurs nulles avant de supprimer quelque chose. Parce qu'un utilisateur peut changer l'Id (à querystring) et essayer différentes combinaisons.

+1

Merci, DonNet Rêveur. Mais toujours vérifier les nulls ne résout pas notre problème. –

+0

J'ai toujours utilisé la fonction Delete comme une méthode POST ('[HttpPost]'), pas un get, ce qui élimine le besoin de sécuriser la chaîne de requête. Les vérifications nulles sont toujours de bonnes pratiques, mais elles ne sont pas pertinentes pour la question de l'OP et ne sont pas non plus la meilleure façon de sécuriser votre application. – Flater

1

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

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(); 
} 
10

Je pense que cela est meilleure option de suppression

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 si j'utilise Remove

1

La réponse ci-dessus peut être obsolète ... La méthode DeleteObject ne semble pas ex est dans la version actuelle de ENtity Framework. J'ai dû utiliser la méthode Remove.

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

@Harold, je sais que ce post est assez vieux, mais je pense qu'il est important de répondre à votre question initiale et la réponse. Votre solution a peut-être fonctionné dans votre situation, mais il y a quelques problèmes. Tout d'abord, votre code d'origine sélectionnait l'enregistrement à supprimer en fonction d'un paramètre transmis. Votre solution supprime l'enregistrement avec le plus grand EmployeeId. Cela pourrait être ce que vous souhaitez, mais pas probable. Le deuxième problème est que deux accès à la base de données sont requis pour effectuer la suppression. Le premier est obtenir l'entité pour supprimer la seconde pour réellement effectuer la suppression.

L'extrait de code suivant élimine le besoin de lire et supprime l'employé "z". Cela devrait produire le résultat souhaité et effectuer beaucoup mieux.

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(); 
    } 
}