Disons que j'interroge la base de données et charge une liste d'éléments. Ensuite, j'ouvre l'un des éléments dans un formulaire de vue détaillée et au lieu de réinterroger l'élément hors de la base de données, je crée une instance de l'élément à partir de la source de données dans la liste.
Existe-t-il un moyen de mettre à jour l'enregistrement de la base de données sans récupérer l'enregistrement de l'élément individuel?
Voici un exemple de comment je le fais maintenant:
dataItem itemToUpdate = (from t in dataEntity.items
where t.id == id
select t).FirstOrDefault();
Ensuite, après avoir extrait l'enregistrement, je mets à jour certaines valeurs de l'élément et repousse l'enregistrement:
itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();
Je pense qu'il y aurait une meilleure façon de faire cela, des idées?
c#
entity-framework
Shane Grant
la source
la source
Réponses:
Vous devez utiliser la méthode Attach () .
Attacher et détacher des objets
la source
Vous pouvez également utiliser SQL direct sur la base de données en utilisant le contexte de la banque de données. Exemple:
Pour des raisons de performances, vous souhaiterez peut-être transmettre des variables au lieu d'une seule chaîne SQL codée en dur. Cela permettra à SQL Server de mettre en cache la requête et de la réutiliser avec des paramètres. Exemple:
UPDATE - pour EF 6.0
la source
ExecuteStoreCommand
n'est pas vraiment un moyen EF de faire cela, il utilise simplement leDbConnection
contenu dans leDbContext
pour exécuter une commande. Ce n'est pas indépendant de la base de données, encore moins de la persistance (par exemple, cet exemple planterait si l'OP passait à XML).Le code:
Le résultat TSQL:
Remarque:
La ligne "IsModified = true" est nécessaire car lorsque vous créez le nouvel objet ExampleEntity (uniquement avec la propriété Id remplie), toutes les autres propriétés ont leurs valeurs par défaut (0, null, etc.). Si vous souhaitez mettre à jour la base de données avec une «valeur par défaut», la modification ne sera pas détectée par la structure d'entité et la base de données ne sera pas mise à jour.
Par exemple:
ne fonctionnera pas sans la ligne "IsModified = true", car la propriété ExampleProperty, est déjà nulle lorsque vous avez créé l'objet ExampleEntity vide, vous devez dire à EF que cette colonne doit être mise à jour, et c'est le but de cette ligne.
la source
Si les
DataItem
champs has EF seront pré-validés (comme les champs non nullables), nous devrons désactiver cette validation pour ce contexte:Sinon, nous pouvons essayer de satisfaire la pré-validation et ne mettre à jour que la seule colonne:
En supposant que
dataEntity
c'est unSystem.Data.Entity.DbContext
Vous pouvez vérifier la requête générée en ajoutant ceci à
DbContext
:la source
Cet article dans le cadre de la mise en route de Microsoft explique les états des entités et comment procéder:
Ajouter / Attacher et États d'entité
Regardez la section 'Attacher une entité existante mais modifiée au contexte'
Maintenant, je vais lire le reste de ces tutoriels.
la source
Cela fonctionne quelque peu différemment dans EF Core:
Il peut y avoir un moyen plus rapide de le faire dans EF Core, mais ce qui suit garantit une mise à jour sans avoir à faire un SELECT (testé avec EF Core 2 et JET sur le .NET Framework 4.6.2):
Assurez-vous que votre modèle n'a pas de propriétés IsRequired
Ensuite, utilisez le modèle suivant (dans VB.NET):
la source
De manière générale, si vous avez utilisé Entity Framework pour interroger tous les éléments et que vous avez enregistré l'objet entité, vous pouvez mettre à jour les éléments individuels dans l'objet entité et appeler
SaveChanges()
lorsque vous avez terminé. Par exemple:La récupération de l'élément souhaité ne doit pas générer de nouvelle requête.
la source