我一直在关注ASP.NET Core和Entity Framework Core的教程。我能够连接到我的Microsoft SQL Server数据库并获取和添加行,但是无法更新它们。我的更新方法将附加一个新用户,然后将状态设置为“修改”。
每次都出现错误:
System.InvalidOperationException:尝试将实体的状态更改为“已修改”时,实体类型“ UserData”的属性“ Id”具有临时值。要么显式设置一个永久值,要么确保将数据库配置为为此属性生成值。'
我尝试将主键属性设置为数据库生成的,并尽力在数据库中实现它,但是我不确定它是否有效。我还尝试使用FromSQL方法运行SQL更新,但是没有任何变化(尝试删除时,我遇到了类似的问题,并且可能是单独的问题)。
这是数据库上下文实现中的更新方法:
public UserData Update(UserData updatedUser)
{
var entity = db.Users.Attach(updatedUser);
entity.State = EntityState.Modified;
//db.Users.FromSql<UserData>($"UPDATE Users SET user_name={updatedUser.user_name}, first_name={updatedUser.first_name}, last_name={updatedUser.last_name}, age={updatedUser.age}, email={updatedUser.email} WHERE");
return updatedUser;
}
我使用另一种方法(在此方法之后直接调用)进行保存更改。
这是我的数据模型:
public class UserData
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int64 Id { get; set; }
public string user_name { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public int age { get; set; }
public string email { get; set; }
}
基本上,我只想用新信息更新用户,而我正在尝试使用attach和entity。我正在遵循的教程中使用的Modify方法,但是如果有更好的方法,我也愿意接受。
编辑:解决方案在我标记为答案的评论中。在我的.cshtml页面上,我没有将用户ID绑定到输入字段,因此默认情况下将其设置为“ 0”。
答案 0 :(得分:3)
当ID未到达更新方法时,会发生此“实体框架核心修改期间的临时值错误”。
问题不在代码中。问题在于您尚未在此处附加视图,而是在“视图”中查找以下内容。
答案 1 :(得分:3)
如果您尝试使用不存在的外键添加实体,也会发生此异常。
答案 2 :(得分:1)
尝试
public UserData Update(UserData updatedUser)
{
var entity = db.Users.Attach(updatedUser);
entity.Entry(updatedUser).State = EntityState.Modified;
entity.SaveChanges();
return updatedUser;
}
如果对您不起作用,请共享您的Page.cshtml。
您可能在更新行时更改了主键值
答案 3 :(得分:0)
当我有唯一索引时,我遇到了同样的异常,AddRange在唯一索引上失败,然后在catch异常块内部尝试删除整个插入的代码。 (不是我的代码,但是我必须修复它:-))
代码示例(简体):
try {
context.AddRange(users); // List<User>, has property List<Contact>
context.SaveChanges(); // throws exception on unique index
} catch (Exception ex) {
context.RemoveRange(users); // this throws exception "The property 'UserID' on entity type 'Contact' has a temporary value"
throw;
}
答案 4 :(得分:-1)