Home > Net >  Create a list of model values differences
Create a list of model values differences

Time:01-09

Currently, I'm working on an Angular (front-end) C# (back-end) application. This application uses Entity Framework code first.

I'm going to work with an Activity Log, basically to save changes inside an app Profile section, so I think about the following model for that:

 public partial class ProfileActivity : BaseAuditModel, IEntity
    {
        public string Description { get; set; }

        public int ProfileId { get; set; }

        public virtual Profile Profile { get; set; }

        public int ActivityTypeId { get; set; }

        public string OldValue { get; set; }
        
        public string NewValue { get; set; }
    }

Well, now on update endpoint (controller), I receive data from the front end as:

    [Authorize]
    [HttpPost("AddProfile")]
    [CleanCache]
    public async Task<ActionResult<Profile>> AddProfile(Profile profile)
    {
        var user = await this.GetUser();
            var model = await _profileService.EditProfile(profile, user);

            if (model != null) return Ok(model);

            return NotFound();
    }

My question is right here. How can I compare the received model (with changes) with the current Profile (with no changes yet)? I can get the model without changes by doing a get operation before saving the changes as:

var currentProfile = GetProfile(profile.Id);

But now, how can I identify all the changes between received profile model and the currentProfile?

Profile Model:

public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public int VettingStatusId { get; set; }
    public int? RecruiterId { get; set; }
   etc..

So, at the end of the date, I can insert into my new table ProfileActivity all the changes where we found the differences.

CodePudding user response:

You can use reflection, for example:

    public static void GetChanges<T>(T a, T b) where T : class {
        foreach (var prop in typeof(T).GetProperties()) {
            if(prop.GetValue(a) != prop.GetValue(b))
                System.Diagnostics.Debug.Print(prop.Name);
        }
    }

CodePudding user response:

From your description, I think you wanna compare two objects and put the different properties into a list mdoel. So you can refer to this simple demo:

NuGet Package:

Install-Package ObjectsComparer

Model:

public class ComparedModel
    {
        public string Description { get; set; }

        public string OldValue { get; set; }

        public string NewValue { get; set; }
    }

Demo:

            //current model
            var a1 = new ClassA()
            {
                Id = 1,
                FirstName = "AAA",
                Age = 23,
                LastName = "BB"
            };

            //new model from frontend
            var a2 = new ClassA()
            {
                Id = 1,
                FirstName = "AAA",
                Age = 16,
                LastName = "BBVV"
            };

            //receive the different properties
            List<ComparedModel> t = new List<ComparedModel>();

            var comparer = new ObjectsComparer.Comparer<ClassA>();
            IEnumerable<Difference> differences;
            var isEqual = comparer.Compare(a1, a2, out differences);
                
            if (!isEqual)
            {
                foreach (var item in differences)
                {
                    t.Add(new ComparedModel()
                    {
                        Description = item.MemberPath,
                        OldValue = item.Value1,
                        NewValue = item.Value2
                    });
                   
                }
            }

You can see the propertiy name, old value and new value have been inserted into the list model.

enter image description here

  • Related