C# 使用EF5更新实体
我刚刚开始了一个新项目,之前在Entity Framework中度过了愉快的时光,我获得了最新版本。在我尝试更新实体之前,一切都进展顺利。我有以下代码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
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来更新计数;)