Home > Software engineering >  Entity Framework validate external entity is not modified
Entity Framework validate external entity is not modified

Time:12-16

I'm trying to validate an entity coming from an External context has not changed.

public class Employee 
{
    public int Id { get; set; }
    public string Name { get; set; }  
}

I have a method which takes in an entity which has not been loaded from the context.

public bool Validate(Employee employee)
{
    using (var context = new Context())
    {
        return context.Entry(employee).State == EntityState.Modified;
    }
} 

I would like to attach and verify that the attached entity is not modified from whats in the database.

I would prefer not to manually have to iterate of the properties. Is there a way to hack around this?

CodePudding user response:

No need to attach the external entity. You can use the external entity to set values of the database entity and then check the state of the latter:

public bool Validate(Employee externalEmployee)
{
    using var context = new Context(); // C# 8.0

    var dbEntity = context.Where(x => x.Id == externalEmployee.Id).SingleOrDefault();
    if (dbEntity != null)
    {
        context.Entry(dbEntity).CurrentValues.SetValues(externalEmployee);
        return context.Entry(dbEntity).State == EntityState.Modified;
    }
    return false; // Or true, depending on your semantics.
}

CodePudding user response:

You can try:

public static List<string> GetChanges<T>(this T obj, T dbObj)
    {
        List<string> result = new List<string>();
        var type = typeof(T);

        foreach (var prop in type.GetProperties())
        {
            var newValue = prop.GetValue(obj, null);
            var dbValue = prop.GetValue(dbObj, null);

            if(newValue == null && dbValue != null)
            {
                result.Add(prop.Name);
                continue;
            }

            if (newValue != null && dbValue == null)
            {
                result.Add(prop.Name);
                continue;
            }

            if (newValue == null && dbValue == null)
                continue;

            if (!newValue.ToString().Equals(dbValue.ToString()))
                result.Add(prop.Name);
        }

        return result;
    }

if resultList.Count > 0, your object has changes.

In your Validate Method:

public bool Validate(Employee employee)
        {
            using (var context = new Context())
            {
                Employee dbEmployee = context.Employee.Find(employee.Id);

                if(employee.GetChanges(dbEmployee).Count > 0)
                    return true;

                return false;
            }
        }

It's a god workaround =D

Works for me!

  • Related