C# 实体框架核心修改期间出现临时值错误
我一直在学习ASP.NET核心和实体框架核心的教程。我可以连接到我的Microsoft SQL Server数据库并获取和添加行,但无法更新它们。我的更新方法附加一个新用户,然后将状态设置为“已修改” 尽管每次我都会出错: System.InvalidOperationException:“试图将实体状态更改为“已修改”时,实体类型“UserData”上的属性“Id”具有临时值。请显式设置永久值,或确保数据库配置为生成此属性的值。” 我已经尝试将主键属性设置为database generated,并尽力在数据库中实现它,但我不确定它是否有效。我还尝试使用FromSQL方法运行SQL更新,但没有任何改变(我在尝试删除时遇到了类似的问题,可能是单独的问题) 以下是db上下文实现中的更新方法:C# 实体框架核心修改期间出现临时值错误,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我一直在学习ASP.NET核心和实体框架核心的教程。我可以连接到我的Microsoft SQL Server数据库并获取和添加行,但无法更新它们。我的更新方法附加一个新用户,然后将状态设置为“已修改” 尽管每次我都会出错: System.InvalidOperationException:“试图将实体状态更改为“已修改”时,实体类型“UserData”上的属性“Id”具有临时值。请显式设置永久值,或确保数据库配置为生成此属性的值。” 我已经尝试将主键属性设置为database generated
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;
}
基本上,我只想用新信息更新用户,我正在尝试使用attach和entity。修改我在下面的教程中使用的方法,但如果有更好的方法,我也愿意这样做
编辑:解决方案在我标记为答案的注释中。在我的.cshtml页面上,我没有将用户Id绑定到输入字段,因此默认情况下它被设置为“0”。试试看
public UserData Update(UserData updatedUser)
{
var entity = db.Users.Attach(updatedUser);
entity.Entry(updatedUser).State = EntityState.Modified;
entity.SaveChanges();
return updatedUser;
}
如果不适合您,请分享您的Page.cshtml
您可能在更新行时更改主键值当我有唯一索引时,我得到了相同的异常,AddRange在唯一索引上失败,然后在catch异常块内尝试删除整个插入的。 (不是我的代码,但我必须修复它:-)) 代码示例(简化):
试试看{
context.AddRange(users);//列表,具有属性列表
context.SaveChanges();//在唯一索引上引发异常
}捕获(例外情况除外){
context.RemoveRange(users);//这会引发异常“实体类型“Contact”上的属性“UserID”具有临时值”
投掷;
}
此“实体框架核心修改期间的临时值错误”发生在ID未到达更新方法时
问题不在代码中。问题在于视图中没有将其附加到此处,但请在“视图”中查找以下内容
如果尝试添加外键不存在的实体,也会发生此异常。解决方案是编辑.cshtml文件。
我想有一行被删除了,或者需要做一些更改:
对不起,我不知道“操作视图”是什么。虽然我尝试过,但在到达任何save语句之前,仍然会出现异常错误。如果您需要使用此方法的.cshtml文件和.cs文件,可以在以下位置查看:和:you not binding id,在您的编辑页面中。cshtml因为您的id字段是int,并且它在更新方法中分配了“0”,正如Muhammad Moid Shams所说,问题是“您没有绑定id”。更好的解决方案可能是在Edit.cshtml中的
下添加
。您的响应就是解决方案。这个错误实际上是不言自明的。我只是遇到了同样的错误。我所做的是在表单中包含ID字段并传递值。这实际上解决了问题感谢这一点,使用AddRange遇到了同样的问题。马塞洛:我刚刚用谷歌翻译了你的答案。你应该用英语回答这个问题,这样我们大多数人都可以使用你的有用的想法和解决方案。非常感谢。
public UserData Update(UserData updatedUser)
{
var entity = db.Users.Attach(updatedUser);
entity.Entry(updatedUser).State = EntityState.Modified;
entity.SaveChanges();
return updatedUser;
}
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;
}