在Entity Framework Code First中更新记录的单个属性

Qua*_* Vo 17 validation entity-framework entity-framework-4.1

如何在不先检索记录的情况下更新记录的单个属性?我在EF Code First 4.1的背景下提出要求

说我有一个类User,映射到数据库中的表Users:

class User
{
    public int Id {get;set;}
    [Required]
    public string Name {get;set;}
    public DateTime LastActivity {get;set;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我想更新用户的LastActivity.我有用户名.我可以通过查询用户记录,将新值设置为LastActivity,然后调用SaveChanges()来轻松完成.但这会导致冗余查询.

我通过使用Attach方法来解决.但是因为EF在Name上抛出了验证异常,如果它为null,我将Name设置为随机字符串(不会更新回DB).但这似乎不是一个优雅的解决方案:

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();
}
Run Code Online (Sandbox Code Playgroud)

如果有人能为我提供更好的解决方案,我会非常高兴.请原谅我有任何错误,因为这是我第一次就SO提问.

Lad*_*nka 36

这是验证实现的问题.验证只能验证整个实体.它不会按预期仅验证已修改的属性.因此,在要使用不完整虚拟对象的情况下应关闭验证:

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();
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用相同的上下文来更新虚拟对象以及更新应该使用验证的整个实体,这显然是一个问题.验证发生在,SaveChanges因此您无法说明应该验证哪些对象,哪些不验证.