Question

Nous avons un modèle de données qui dispose de certaines exigences. Je voudrais trouver un moyen de rendre ces exigences aussi transparentes que possible tout en utilisant EF.

Premièrement, le modèle doit prendre en charge Soft-Suppr. J'ai assisté à quelques questions à ce sujet et je pense que ce serait relativement droit.

Deuxièmement, nous avons une politique "insert seulement". Cela signifie aucune mise à jour. Lorsqu'une mise à jour est faite, une nouvelle entrée doit être insérée à la place. J'aimerais pouvoir traiter l'opération comme une mise à jour et que le cadre puisse le changer à un insert derrière les scènes.

troisième, à cause du n ° 2 lorsque nous interrogeons, nous devons commander en descendant sur la colonne Identity et renvoyer le premier enregistrement uniquement. Même lors d'une requête qui retourne de nombreux enregistrements. Essentiellement cela crée une histoire de version.

quatrième, nous ne voulons pas avoir à mettre en œuvre cette logique dans chaque requête. Ce serait bien d'avoir le cadre pour nous faire pour nous afin que nous puissions traiter chaque requête comme s'il s'agissait d'une transaction de type crud normale.

Quelqu'un a-t-il mis en œuvre un tel modèle de données dans EF? Quelles techniques avez-vous utilisées?

Je suis conscient du fait qu'une partie de cela peut être faite dans des vues et / ou des Sprates, mais si vous utilisez des vues, vous devez conserver toutes les relations manuellement (EF ne peut pas lire les relations à travers les vues). Les déclencheurs sont également une possibilité, mais notre DBA souhaite que quelques déclencheurs que possible et une politique de révision très étendue sur tous les déclencheurs qui prend beaucoup de temps à accomplir. Je préférerais ne pas utiliser de déclencheur si je n'en ai pas à.

Je travaille principalement dans une première approche de la base de données, mais j'utilise dBContext.

EDIT:

Compte tenu des commentaires de Ladislav ci-dessous, je serais également intéressé par des commentaires sur les autres ORM pouvant être en mesure de gérer ces exigences.

Était-ce utile?

La solution

  1. Ceci est possible avec la mappage conditionnel où une colonne supplémentaire sera utilisée pour différer des enregistrements supprimés et Commande SQL personnalisée / Mapped Procédure stockée pour chaque entité nécessitant Soft Suppr pour effectuer la mise à jour au lieu de supprimer.
  2. Je doute de EF gérera cette transparence. Si vous modifiez une instance ci-jointe chargée de la base de données, elle effectuera la mise à jour. Vous pouvez à nouveau cartographier la procédure stockée pour effectuer une insertion au lieu de la mise à jour, mais ce changement ne sera pas reflété dans votre logique d'application. Vous devrez éliminer le contexte et recharger des données avec une nouvelle instance de contexte pour voir les modifications correctement. Une meilleure option est simplement forcer votre application quelque part pour cloner une entité et insérer le clone en tant que nouveau.
  3. EF ne vous permettra pas d'ajouter de telles conditions aux requêtes autogénérés de manière transparente, à moins que vous ne mappiez comme une vue ou Query SQL personnalisé . Une fois que vous avez utilisé la requête d'affichage ou SQL, vous devez également utiliser des commandes SQL ou des procédures stockées à partir d'opérations d'insertion, de mise à jour et de suppression. Utilisation de la requête SQL personnalisée a les mêmes inconvénients que d'utiliser des vues.
  4. Si vous n'utilisez pas de requête SQL, vous devrez écrire vous-même une requête vous-même par exemple sous forme de méthode d'extension réutilisable personnalisée et l'utiliser partout, mais sachez que le chargement désireux ou paresseux ne le reflétera pas. En cas de chargement désireux et paresseux, vous obtiendrez toujours toutes les versions.

    La cartographie de la procédure stockée nécessite EDMX. La commande SQL personnalisée et la cartographie de requête nécessitent EDMX et sans autre outil commercial que vous devrez également gérer manuellement EDMX.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top