C# 使用EF5更新实体

C# 使用EF5更新实体,c#,entity-framework,C#,Entity Framework,我刚刚开始了一个新项目,之前在Entity Framework中度过了愉快的时光,我获得了最新版本。在我尝试更新实体之前,一切都进展顺利。我有以下代码 using (var c = new EFContext()) { Data.User u = new Data.User() { UserId = UserId }; c.Users.Attach(u); u.FailedPasswordAttemptCount = newFailedPasswordAtte

我刚刚开始了一个新项目,之前在Entity Framework中度过了愉快的时光,我获得了最新版本。在我尝试更新实体之前,一切都进展顺利。我有以下代码

using (var c = new EFContext())
{
      Data.User u = new Data.User() { UserId = UserId };
      c.Users.Attach(u);
      u.FailedPasswordAttemptCount = newFailedPasswordAttemptCount;
      c.SaveChanges();
}
这在EF4中运行良好。然而,在EF5中,这与DbEntityValidationException无关,因为我在用户表(UserName)中有一个不可为空的字段

我可以通过创建用户名为空的Data.User对象并告诉EF哪些属性已经修改来解决这个问题

using (var c = new EFContext())
{
      Data.User u = new Data.User() { UserId = UserId, UserName = "" };
      ...
      c.Entry(u).Property("FailedPasswordAttemptCount ").IsModified = true;
      ...
}
但这似乎不是特别容易管理的,因为更多不可为空的字段被添加到这个表和许多其他表中

声明
Attach
仅适用于从
EntityObject
派生的实体。因此,我假设EF5对象不是由此派生的

任何人都知道我如何更新实体,而不必每次都指定所有不可为空的字符串字段


感觉我错过了一些非常明显的东西……

如果这是一个现有用户,您可以这样做

c.Users.First(user=>user.UserId == UserId).FailedPasswordAttemptCount =         newFailedPasswordAttemptCount;

c.SaveChanges(); 
顺便说一下,在EF5代码优先中,实体类不是从任何东西派生的,但仍然可以附加

或者,返回到附加的方式,但我认为需要关闭此保存的验证,因为EF似乎只验证整个实体,或者什么也不验证

using (var c = new EFContext()) 
{       
    c.Configuration.ValidateOnSaveEnabled = false; 
    Data.User u = new Data.User() { UserId = UserId };       
    c.Users.Attach(u);       
    u.FailedPasswordAttemptCount = newFailedPasswordAttemptCount;       
    c.SaveChanges(); 
} 

贾斯汀,谢谢你在EF类上的指针没有被派生出来。我希望避免执行您建议的操作,因为这会两次命中数据库,一次选择,一次更新。这似乎是一个棘手的问题,通过禁用验证有一个解决方法,请参阅上面的更新。如果您正在增加FailedPasswordAttemptCount,那么您肯定已经为该用户执行了选择,检查用户名和密码。除非我遗漏了什么:)在上下文上设置ValidateOnSaveEnabled效果很好。谢谢,贾斯汀。在大多数情况下,验证用户的属性是有意义的,但在这种情况下不是这样。很高兴知道它可以关闭@MarkWithers事实确实如此,但是跨多个层时,DBContext将丢失,因此如果发现用户输入了错误的密码,则需要创建一个新的DBContext来更新计数;)