Comment supprimer un objet d'un modèle Entity Framework sans le charger au préalable?

asp.net-mvc entity-framework linq-to-entities

Question

Je suis à peu près sûr que j'ai trouvé la réponse à cette question quelque part, mais comme je ne pouvais pas la trouver avec quelques recherches sur SO ou sur Google, je la pose quand même ...

Dans Entity Framework, le seul moyen de supprimer un objet de données semble être

MyEntityModel ent = new MyEntityModel();
ent.DeleteObject(theObjectToDelete);
ent.SaveChanges();

Cependant, cette approche nécessite que l'objet soit chargé, dans ce cas, d'abord sur le contrôleur, juste pour le supprimer. Existe-t-il un moyen de supprimer un objet métier référençant uniquement, par exemple, son ID?

S'il existe un moyen plus intelligent d'utiliser les expressions Linq ou Lambda, c'est très bien aussi. L'objectif principal, cependant, est d'éviter de charger des données simplement pour les supprimer.

Réponse acceptée

Cela vaut la peine de savoir que Entity Framework prend en charge à la fois Linq to Entities et Entity SQL. Si vous souhaitez effectuer des suppressions ou des mises à jour pouvant affecter de nombreux enregistrements, vous pouvez utiliser l'équivalent de ExecuteNonQuery .

Dans Entity SQL, cela pourrait ressembler à

   Using db As New HelloEfEntities

        Dim qStr = "Delete " & _
                  "FROM Employee"
        db.ExecuteStoreCommand(qStr)
        db.SaveChanges()
    End Using

Dans cet exemple, db est mon ObjectContext . Notez également que la fonction ExecuteStoreCommand un tableau facultatif de paramètres.


Réponse populaire

J'ai trouvé ce post , qui dit qu'il n'y a vraiment pas de meilleur moyen de supprimer des enregistrements. L'explication donnée est que toutes les clés étrangères, relations, etc. uniques pour cet enregistrement sont également supprimées. EF doit donc disposer des informations correctes sur l'enregistrement. Je suis intrigué par la raison pour laquelle cela ne pourrait être réalisé sans le chargement en aval des données, mais comme cela ne se produira pas très souvent, j'ai décidé (pour l'instant) de ne pas m'en soucier.

Si vous avez une solution à ce problème, n'hésitez pas à me le faire savoir =)



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow