Search code examples
entity-frameworkvalidationentity-framework-4.1

Update a single property of a record in Entity Framework Code First


How can I update a single property of a record without retrieving it first? I'm asking in the context of EF Code First 4.1

Says I have a class User, mapping to table Users in Database:

class User
{
    public int Id {get;set;}
    [Required]
    public string Name {get;set;}
    public DateTime LastActivity {get;set;}
    ...
}

Now I want to update LastActivity of a user. I have user id. I can easily do so by querying the user record, set new value to LastActivity, then call SaveChanges(). But this would result in a redundant query.

I work around by using Attach method. But because EF throws a validation exception on Name if it's null, I set Name to a random string (will not be updated back to DB). But this doesn't seem a elegant solution:

using (var entities = new MyEntities())
{
    User u = new User {Id = id, Name="this wont be updated" };
    entities.Users.Attach(u);
    u.LastActivity = DateTime.Now;
    entities.SaveChanges();
}

I would be very appriciate if someone can provide me a better solution. And forgive me for any mistake as this is the first time I've asked a question on SO.


Solution

  • This is a problem of validation implementation. The validation is able to validate only a whole entity. It doesn't validate only modified properties as expected. Because of that the validation should be turned off in scenarios where you want to use incomplete dummy objects:

    using (var entities = new MyEntities())
    {
        entities.Configuration.ValidateOnSaveEnabled = false;
    
        User u = new User {Id = id, LastActivity = DateTime.Now };
        entities.Users.Attach(u);
        entities.Entry(user).Property(u => u.LastActivity).IsModified = true;
        entities.SaveChanges();
    }
    

    This is obviously a problem if you want to use the same context for update of dummy objects and for update of whole entities where the validation should be used. The validation take place in SaveChanges so you can't say which objects should be validated and which don't.