EntityState.Deleted ne fonctionne pas, Supprimer (entité) fait?

J’ai eu du mal avec EF lorsque je tentais de lire des enregistrements, puis de les supprimer dans la même transaction. J’utilisais initialement la méthode EntityState.Deleted, ce qui donnerait une erreur:

L’opération a échoué: la relation n’a pas pu être modifiée car une ou plusieurs propriétés de clé étrangère ne sont pas nullables. Lorsqu’une modification est apscope à une relation, la propriété de clé étrangère associée est définie sur une valeur null. Si la clé étrangère ne prend pas en charge les valeurs NULL, vous devez définir une nouvelle relation, affecter une autre valeur non null à la propriété de clé étrangère ou supprimer l’object non associé.

Mais si je le change comme ci-dessous, en utilisant .Remove (), tout va bien.

  1. Quelle est la différence et les meilleurs moments pour utiliser .Remove () vs .Deleted?
  2. Comment pourrais-je faire ce travail en utilisant la méthode .Deleted? J’ai essayé de créer une nouvelle instance du contexte dans mon référentiel à lire et une autre à supprimer, mais des erreurs liées à IEntityTracker ne permettent pas de suivre plusieurs instances. dans EF pour qu’il les connaisse et les supprime. J’ai également essayé. Détacher les enregistrements lus en premier. Tout en rien.

Voici la méthode en question. Notez que j’ai un référentiel générique qui utilise la méthode .Deleted qui m’a bien servi jusqu’à ce scénario (lecture puis suppression des mêmes enregistrements).

//Delete Allocation Need and AllocatedContainers for alloc need id public ActionConfirmation DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId) { var context = new InventoryMgmtContext(); var repository = new AllocationNeedRepository(context); //Delete Allocation Need and hence children in Allocated Containers var srcType = needSourceType.ToSsortingng(); List allocNeeds = repository.SearchFor( x => x.FacilityId == intFacilityId && x.NeedSourceType == srcType && x.NeedSourceId == intNeedSourceId ).ToList(); //var deleteRepository = new Repository(); <--tried separate instance of context to delete...no worky. foreach (AllocationNeed allocNeed in allocNeeds) { try { //NO WORK: context.Entry(allocNeed).State = System.Data.EntityState.Deleted; context.AllocationNeeds.Attach(allocNeed); context.AllocationNeeds.Remove(allocNeed); <-- Works context.SaveChanges(); } catch (Exception ex) { return ActionConfirmation.CreateFailureConfirmation(ex.Message, allocNeed.Id); } } 

Remove supprimera également les objects enfants, mais l’utilisation de Deleted ne le sera pas. Vous devriez vraiment utiliser Remove pour cette raison même. Si vous voulez vraiment utiliser Deleted , vous devez rendre vos clés étrangères nullables, mais vous vous retrouverez avec des enregistrements orphelins (une des principales raisons pour lesquelles vous ne devriez pas le faire en premier lieu).

1.) Quelle est la différence et les meilleurs moments pour utiliser .Remove () vs .Deleted?

Il semble qu’en définissant l’état de l’entité sur Deleted, SaveChanges () supprime uniquement cette entité spécifique de la firebase database, sans prendre en compte les autres lignes susceptibles de la référencer via une colonne de clé étrangère non nulle.

Remove() prendra en compte les lignes qui font partie de la relation.

2.) Comment pourrais-je faire ce travail en utilisant la méthode .Deleted?

Si le comportement ON CASCADE DELETE spécifié pour les lignes associées, la firebase database doit le gérer automatiquement. C’est le comportement par défaut lorsque vous laissez EF générer la firebase database.