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 中的 &lt;form&gt; 下添加 &lt;input type="hidden" asp-for="updatedUser.ID" /&gt;【参考方案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 中的动态数据模型

Entity Framework Core 6.0 预览4 性能改进

Entity Framework Core快速开始

Entity Framework Core 快速开始