2

我刚刚开始了一个新项目,并且在 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;
      ...
}

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

这个问题指出,这Attach仅适用于派生自EntityObject. 所以我假设 EF5 对象不是由此派生的。

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

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

4

1 回答 1

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(); 
} 
于 2012-10-15T11:21:44.077 回答