使用EF5更新实体

时间:2012-10-15 11:15:20

标签: c# entity-framework

我刚刚开始了一个新项目并且曾经有过Entity Framework的快乐时光,我在最新版本中看到了Nuget。一切顺利,直到我尝试更新实体。我有以下代码;

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)中有一个不可为空的字段。

我可以通过使用空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;
      ...
}

但这似乎并不特别易于管理,因为更多的非可空字段被添加到此表和许多其他表中。

This question声明Attach仅适用于从EntityObject派生的实体。所以我假设EF5对象不是从这里得到的。

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

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

1 个答案:

答案 0 :(得分:1)

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

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(); 
}