我刚刚开始一个新项目,之前使用 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 中,由于我在用户表 (UserName) 中有一个不可为 null 的字段,因此出现 DbEntityValidationException。
我可以通过使用空用户名创建我的 Data.User 对象并告诉 EF 哪些属性已被修改来解决这个问题,
using (var c = new EFContext())
{
Data.User u = new Data.User() { UserId = UserId, UserName = "" };
...
c.Entry(u).Property("FailedPasswordAttemptCount ").IsModified = true;
...
}
但这似乎不是特别易于管理,因为更多不可为 null 的字段被添加到此表和许多其他表中。
This question声明 Attach
仅适用于从 EntityObject
派生的实体。所以我假设 EF5 对象不是由此派生的。
任何人都知道如何更新我的实体而不必每次都指定所有不可为 null 的字符串字段。
感觉我错过了一些非常明显的东西......
最佳答案
如果这是现有用户,您可以这样做...
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();
}
关于c# - 使用 EF5 更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894452/