我正在学习ASP.NET核心和实体框架核心的教程。我能够连接到我的Microsoft SQL Server数据库并获取和添加行,但我不能更新它们。我的update方法附加了一个新用户,然后将状态设置为modified。
但每次我都得到错误:
系统操作无效异常:尝试将实体类型"UserData"的状态更改为"Modified"时,该实体类型的属性"Id"具有临时值。请显式设置永久值,或确保将数据库配置为生成此属性的值。
我试过将主键属性设置为数据库生成,并尽我所能在数据库中实现它,但我不确定它是否有效。我还试过使用FromSQL方法运行SQL更新,但没有任何变化(当我尝试删除时,我遇到了类似的问题,可能是单独的问题)。
下面是来自数据库上下文实现的update方法:
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; }
}
基本上我只是想用新的信息更新一个用户,我试着使用附件和实体。修改方法在教程中使用,但如果有一个更好的方法,我也开放。
- EDIT**:答案在我标记为答案的注解中。在我的. cshtml页面上,我没有将用户ID绑定到输入字段,因此默认设置为"0"。
6条答案
按热度按时间50pmv0ei1#
如果尝试添加具有不存在的外键的实体,也会发生此异常。
2ledvvac2#
试试看
如果没有为您工作,请分享您的Page.cshtml。
您可能在更新行时更改了主键值
drkbr07n3#
当ID未到达Update方法时,会发生此“实体框架核心修改期间的临时值错误”。
问题不在代码中。问题在视图中,您没有在这里附加它,但请在“视图”中查找以下内容。
1.确保表单中存在“ID”属性。
1.如果它存在,然后检查您是否已禁用它?如果是,不要禁用它。它不会传递数据时,您发布它。
1.(如果ID是主键)确保ID安全地到达Update方法而没有被更改。
gpnt7bae4#
我得到了同样的异常,当我有唯一的索引,AddRange失败的唯一索引,然后在捕获异常块是尝试删除整个插入.(不是我的代码,但我必须修复它:-))
代码示例(简化):
mlmc2os55#
解决方案是编辑.cshtml文件。
我认为被删除或需要更改的行是:
并在
<form method="post">
标记中添加隐藏的Id输入。ef1yzkbh6#
如果我尝试删除一个还没有真正添加的对象,就会发生这种情况。EF希望我们从上下文中删除相关对象,而不仅仅是从nav属性中孤立它们,但是如果您从上下文中删除一个还没有在上下文中的对象(可能用户添加了一个项目,然后立即删除它),那么当您尝试删除它时,就会收到这个错误。
一个简单的解决方法是只从上下文中删除具有“真实的”主键的对象: