Entity Framework Core 修改期间的临时值错误

kf7*_*ags 14 c# sql-server entity-framework-core asp.net-core

我一直在学习 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;
}
Run Code Online (Sandbox Code Playgroud)

我在另一种方法中进行了保存更改,该方法在此方法之后直接调用。

这是我的数据模型:

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; }
}
Run Code Online (Sandbox Code Playgroud)

基本上我只想用新信息更新用户,我正在尝试使用附加和实体。修改我正在关注的教程中使用的方法,但如果有更好的方法,我也愿意接受。

编辑:解决方案在我标记为答案的评论中。在我的 .cshtml 页面上,我没有将用户的 Id 绑定到输入字段,因此默认情况下它被设置为“0”。

rlv*_*dan 9

如果您尝试添加具有不存在的外键的实体,也会发生此异常。


小智 8

当 ID 未到达更新方法时,会发生此“Entity Framework Core 修改期间的临时值错误”。

问题不在代码中。问题出在您尚未将其附加到此处的视图中,但在“视图”中查找以下内容。

  1. 确保表单中存在“ID”属性。
  2. 如果存在,请检查您是否已禁用它?如果是,请勿禁用它。当你发布它时它不会传递数据。
  3. (如果ID是主键)确保ID安全地到达Update方法而不被改变。


Muh*_*ams 7

尝试

    public UserData Update(UserData updatedUser)
    {
        var entity = db.Users.Attach(updatedUser);
        entity.Entry(updatedUser).State = EntityState.Modified;
        entity.SaveChanges(); 
        return updatedUser;
    }
Run Code Online (Sandbox Code Playgroud)

如果不适合您,请分享您的 Page.cshtml。

您可能在更新行时更改主键值

  • 您没有在编辑 page.cshtml 中绑定 id,因为您的 id 字段是 int 并且在您的更新方法中分配了“0” (3认同)
  • 正如 Muhammad Moid Shams 所说,问题是“你没有绑定 id”。更好的解决方案可能是在 Edit.cshtml 中的 `&lt;form&gt;` 下添加 `&lt;input type="hidden" asp-for="updatedUser.ID" /&gt;`。 (2认同)