Entity Framework Core 修改期间的临时值错误
Posted
技术标签:
【中文标题】Entity Framework Core 修改期间的临时值错误【英文标题】:Temporary Value Error During Entity Framework Core Modify 【发布时间】:2019-09-18 13:52:57 【问题描述】:我正在学习 ASP.NET Core 和 Entity Framework Core 的教程。我能够连接到我的 Microsoft SQL Server 数据库并获取和添加行,但我无法更新它们。我的更新方法附加了一个新用户,然后将状态设置为已修改。
虽然每次我得到错误:
System.InvalidOperationException:“实体类型“UserData”的属性“Id”在尝试将实体的状态更改为“Modified”时具有临时值。要么明确设置一个永久值,要么确保将数据库配置为为此属性生成值。'
我尝试将主键属性设置为数据库生成,并尽我所能在数据库中实现它,但我不确定它是否有效。我还尝试使用 FromSQL 方法运行 SQL 更新,但没有任何改变(当我尝试删除时,我遇到了类似且可能是单独的问题)。
这是来自 db 上下文实现的更新方法:
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;
基本上我只想用新信息更新用户,我正在尝试使用附加和实体。修改我正在关注的教程中使用的方法,但如果有更好的方法我也愿意。
编辑:解决方案在我标记为答案的评论中。在我的 .cshtml 页面上,我没有将用户的 Id 绑定到输入字段,因此默认情况下它被设置为“0”。
【问题讨论】:
【参考方案1】:如果您尝试使用不存在的外键添加实体,也会发生此异常。
【讨论】:
【参考方案2】:试试
public UserData Update(UserData updatedUser)
var entity = db.Users.Attach(updatedUser);
entity.Entry(updatedUser).State = EntityState.Modified;
entity.SaveChanges();
return updatedUser;
如果不适合您,请分享您的 Page.cshtml。
您可能会在更新行时更改主键值
【讨论】:
对不起,我不知道“操作视图”是什么。我确实尝试过,但在我到达任何保存语句之前仍然收到异常错误。如果您要求使用此方法的 .cshtml 文件和 .cs 文件,可以在以下位置查看:link 和:link 您没有绑定编辑 page.cshtml 中的 id,因为您的 id 字段是 int 并且在您的更新方法中分配了“0” 正如 Muhammad Moid Shams 所说,问题是“你没有绑定 id”。更好的解决方案可能是在 Edit.cshtml 中的<form>
下添加 <input type="hidden" asp-for="updatedUser.ID" />
。【参考方案3】:
当 ID 未到达更新方法时,会发生此“Entity Framework Core Modify 期间的临时值错误”。
问题不在代码中。问题出在您未在此处附加的视图中,但请在“视图”中查找以下内容。
-
确保表单中存在“ID”属性。
如果存在,请检查您是否禁用了它?如果是,请不要禁用它。它不会
在发布数据时传递数据。
(如果 ID 是主键)确保 ID 安全到达 Update 方法而不被
改变了。
【讨论】:
您的回复就是解决方案。该错误实际上是不言自明的。我刚遇到同样的错误。我所做的是在表单中包含 ID 字段并传递值。这实际上解决了问题【参考方案4】:当我有唯一索引时,我遇到了同样的异常,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;
【讨论】:
感谢您,使用 AddRange 遇到了同样的问题。自己弄清楚这将是一场噩梦。【参考方案5】:解决方案是编辑 .cshtml 文件。 我认为已删除或需要更改的行是:
<input type="hidden" asp-for="Persona.Id" />
【讨论】:
marcelo 我刚刚用谷歌翻译了你的答案。您应该用英语回答问题,以便我们大多数人可以使用您的有用想法和解决方案。谢谢。以上是关于Entity Framework Core 修改期间的临时值错误的主要内容,如果未能解决你的问题,请参考以下文章
修改从 Entity Framework Core 返回的本地实体后,为啥我的执行消失了?
Entity Framework Core 7中高效地进行批量数据插入
Entity Framework Core 中的动态数据模型