12 votes

linq-to-sql "Impossible de supprimer une entité qui n'a pas été rattachée".

Je reçois l'erreur Cannot remove an entity that has not been attached. lorsque j'essaie de supprimer un enregistrement. J'ai fait des recherches sur Internet et bien qu'il y ait de nombreux endroits où trouver la solution à ce problème, la solution suggérée ne me mène pas plus loin :

using (MyDataContext TheDC = new MyDataContext())
{
  TheDC.MyTable.Attach(ARecord); //added this line but doesn't fix it.
  TheDC.MyTable.DeleteOnSubmit(ARecord);
  TheDC.SubmitChanges();

Ma grande question est la suivante : ce problème affecte-t-il UNIQUEMENT les requêtes de suppression ou affecte-t-il également d'autres types de requêtes et je n'ai pas encore rencontré ce problème. J'ai écrit une requête de mise à jour et elle semble fonctionner sans rencontrer cette erreur.

Merci.

15voto

Gent Points 1409

Veuillez vous référer à cet article du SO Post : Comment supprimer dans linq to sql ?

...sur l'attachement, si vous avez déjà la clé primaire. Si vous n'avez pas la clé primaire, j'ai toujours fait une recherche puis une suppression, mais, chaque fois que je fais une recherche, j'ai tendance à stocker la clé primaire pour les mises à jour et les suppressions.

Il supprimera la clé primaire, mais si vous l'avez, il suffit de l'attacher comme je le fais ci-dessous et d'appeler la suppression. Je ne transmets pas l'objet nécessaire à DLINQ car je veux pouvoir le modifier si je le souhaite. Je transmets donc un objet User différent et je tire simplement le PK de la classe métier pour le mettre dans la classe DAO.

var db = new MeatRequestDataContext();            
if (input.UserID > 0)
{
     entity = new User()
     {
         UserID = input.UserID
     };
     db.Users.Attach(entity);
     db.Users.DeleteOnSubmit(entity);
 }

6voto

aherocalledFrog Points 506

Pour moi, la solution consistait à rechercher d'abord l'objet de la base de données.

var db = new MeatRequestDataContext();
if (input.UserID > 0)
{
    var existing = db.Users
        .Single(user => user.UserID == input.UserID);

    db.Users.DeleteOnSubmit(existing);
}

Dans mon esprit, je ne pouvais supprimer que ce qui était déjà là, et je devais donc d'abord aller chercher dans la base de données les éléments que je voulais supprimer. Cela fonctionne également avec les collections et DeleteAllOnSubmit().

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