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

后端 未结 3 886
迷失自我
迷失自我 2020-12-30 03:33

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

相关标签:
3条回答
  • 2020-12-30 04:31

    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.

    0 讨论(0)
  • 2020-12-30 04:31

    You can try a sort of hack:
    context.Database.ExecuteSqlCommand("update [dbo].[Users] set [LastActivity] = @p1 where [Id] = @p2",
    new System.Data.SqlClient.SqlParameter("p1", DateTime.Now),
    new System.Data.SqlClient.SqlParameter("p2", id));

    0 讨论(0)
  • 2020-12-30 04:32

    I'm actually dealing with this right now. What I decided to do was override the ValidateEntity method in the DB context.

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        var result = base.ValidateEntity(entityEntry, items);
    
        var errors = new List<DbValidationError>();
    
        foreach (var error in result.ValidationErrors)
        {
            if (entityEntry.Property(error.PropertyName).IsModified)
            {
                errors.Add(error);
            }
        }
    
        return new DbEntityValidationResult(entityEntry, errors);
    } 
    

    I'm sure there's some holes that can be poked in it, but it seemed better than the alternatives.

    0 讨论(0)
提交回复
热议问题