2016-10-18 1 views
0

J'utilise EF 5 (pas 6). J'ai un objet de classe inférieure et il est dans DB utilisant EF.Comment vérifier si la propriété change réellement avant une mise à jour

public class Student 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public DateTime DOB { get; set;} 
} 

Plus tard,

Je demande a obtenu de faire une mise à jour même objet/enregistrement.

Mais avant de faire l'appel de mise à jour, je voudrais comparer comparer si la propriété a réellement changé parce que je peux obtenir le même enregistrement pour une mise à jour afin de ne pas faire de mise à jour aveugle.

var student = _context.Students.select(x =>x.Name == "").first(); 
student.name = ""; 
student.age = ""; 
student.DOB = ""; 
_context.Entry(student).State = EntityState.Modified; 
_context.saveChanges(); 

Est-ce qu'EF me donne un moyen d'y arriver? Ou, j'ai besoin de comparer chaque propriété une par une et de décider? Je peux avoir 20 propriétés ...

Une idée s'il vous plaît?

+0

Que signifie _ "Je peux obtenir le même enregistrement pour une mise à jour" _, exactement? Votre enregistrement n'a pas de clé primaire? – CodeCaster

+0

ayant la clé primaire ferait quelle différence à ma question? Mon enregistrement enregistré a une clé primaire. plus tard, quelqu'un a appelé la même méthode en envoyant simplement les paramètres Name, Age et DOB. Maintenant, j'ai besoin de décider si juste faire appel à la mise à jour aveugle ou au moins comparer les propriétés en premier? à moins que je manque quelque chose imp sur EF – simbada

+0

Si vous supprimez la ligne '_context.Entry (étudiant) .State = EntityState.Modified;', EF fera le contrôle pour vous. –

Répondre

0

La méthode Equals et l'interface IEquatable<T> peuvent être utilisées pour savoir si deux objets sont égaux mais ils ne permettent pas de connaître les différences entre les objets.

1

L'énoncé ci-dessous:

_context.Entry(student).State = EntityState.Modified; 
_context.saveChanges(); 

mettra à jour tout le domaine concerné de l'entité, ainsi marqué comme sale.

Sur le code derrière est comme ceci:

UPDATE student 
SET Value 1 = 'whatever student name is', 
    Value 2 = 'whatever student name is' 
WHERE Id = 123; 

Si vous souhaitez mettre à jour la valeur spécifique, s'il vous plaît utiliser le

_context.Student.Attach(student) 

Ce qui sur le code derrière ressemblera à ceci:

UPDATE student 
    SET Value 1 = 'whatever student name is' 
WHERE Id = 123; 

Si vous souhaitez vérifier si la propriété a été modifiée avant la mise à jour, remplacez la méthode equals de votre o bjet et comparer les propriétés que vous désirez:

public override bool Equals(object obj) 
{ 
    return MyProperty == ((MyObject)obj).MyProperty 
} 
0

A partir de EF 6

context.ChangeTracker.HasChanges() 

S'il vous plaît se référer à la documentation

Vérifie si le DbContext est suivi de tout nouveau, supprimé ou modifié entités ou relations qui seront envoyées à la base de données si SaveChanges est appelé.

DBChangeTracker Class

Ou vous pouvez lire ce blog comment cette méthode Secrets of DetectChanges

MISE À JOUR: Pour EF 5, il existe une alternative

return this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added 
               || e.State == EntityState.Modified 
               || e.State == EntityState.Deleted); 

Cette réponse est non le mien, je le prends de ce answer alors donnez du crédit à la bonne personne.

+0

Malheureusement, je ne suis pas EF 6 et même ne pas aller à EF 6 bientôt. – simbada

+1

@simbada version désolée n'a pas été spécifiée, c'est juste pour référence également – Sherlock

+1

@simbada Si votre question est spécifique à une version, puis ajouter cette information importante à votre question. –