1
votes

Comparez un objet complexe et obtenez la différence C # .NET Core 3.1

J'ai deux objets de la classe Profile et je veux les comparer pour faire la différence. Pour mieux expliquer:

public void PostChangelogProfileDetail(Profile oldProfile, Profile newProfile)
{
    ProfileDetailChangeLog profileDetailChangeLog = new ProfileDetailChangeLog();

    //COMPARE oldProfile AND newProfile

    foreach ( //difference resulted in the compare)
    {
        profileDetailChangeLog.VisitorId = newProfile.VisitorId;
        profileDetailChangeLog.ModifiedRecord = //name of the attribute modified (Age, Description, etc...)

        _profileDetailChangeLog.Create(profileDetailChangeLog);
    }
}

Je veux connaître dans ma méthode les différences entre l'objet oldProfile et newProfile pour faire un changelog.

Par exemple, si oldProfile avait Age = 10 et Description = "old" et newProfile code > a Age = 11 et Description = "new" , je voudrais maintenant faire ces différences pour faire deux insertions différentes dans ma base de données:

    public partial class Profile
    {
        public long Id { get; set; }
        public long VisitorId { get; set; }
        public string Description { get; set; }
        public long Age { get; set; }
        public DateTime? LastUpdate { get; set;}
    }


1 commentaires

Il existe différentes façons de comparer l'objet 1) écrivez votre code pour comparer propriété par propriété 2) utilisez une bibliothèque; par exemple, vous pouvez utiliser Json pour trouver la différence en utilisant jsondiffpatch.net. Vérifiez cette réponse - stackoverflow.com/questions/24876082/...


4 Réponses :


2
votes

Vous cherchez probablement à utiliser des métadonnées EF Cores sur un objet qu'il suit pour déterminer les modifications qui y sont apportées. J'ai moi-même fait quelque chose de similaire à la solution stackoverflow dans .net core 3, ce qui me fait croire que 3.1 devrait également fonctionner.

Il existe des articles décrivant des approches pour cela dans les articles suivants: Récupération de toutes les modifications apportées à un objet dans l'entité Framework et ChangeTracker dans Entity Framework Core .


1 commentaires

Je ne savais pas cette chose, je vais certainement envisager à l'avenir ce genre d'approche.



1
votes

Installer le package à partir du nugget Install-Package ObjectsComparer

Et puis impliquer comparer: var cmpr = nouveau Comparer (); / * comparer isSame est la variable booleab et retournera true si les deux objets sont identiques * / IEnumerable diff;

bool isSame = cmpr.Compare (obj1, obj2, out diff);


2 commentaires

Merci beaucoup, je vois ce package et il est parfait pour mes besoins. C'est également gratuit, non?


J'ai vraiment aimé le framework mais c'est un peu redondant si vous voulez quand même mettre à jour votre base de données.



2
votes

Lorsque vous appelez Ajoutez ou Update ef core renvoie EntityEntry . À partir de laquelle EntityEntry vous pouvez obtenir les valeurs actuelles et anciennes via les OriginalValues ​​ (renvoie les anciennes valeurs) et les CurrentValues ​​ (renvoie les nouvelles valeurs) Propriétés.

À partir de là, vous pouvez comparer et consigner les différences entre les valeurs d'origine et les valeurs actuelles via Reflection pour voir le type / nom de la propriété et la valeur car leur type de retour est PropertyValues ​​.


2 commentaires

Merci pour votre réponse, je garderai à l'esprit cette astuce.


Voir ma réponse sur la façon dont vous n'avez pas à interroger vous-même les valeurs actuelles.



1
votes

Pour les entités déconnectées, j'ai trouvé ceci solution .

Pour rechercher des modifications sur une entité existante:

var existing = context.Find<Item>(1);
if (existing != null) 
{ 
   context.Entry(existing).CurrentValues.SetValues(changed);
}

Son EntityState sera Modified par la suite, mais uniquement là où il y a des changements réels.

La même réponse a été publiée ici .

p >


0 commentaires