【问题标题】:Temporary Value Error During Entity Framework Core ModifyEntity Framework Core 修改期间的临时值错误
【发布时间】: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”。

【问题讨论】:

    标签: c# sql-server asp.net-core entity-framework-core


    【解决方案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 期间的临时值错误”。

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

      1. 确保表单中存在“ID”属性。
      2. 如果存在,请检查您是否禁用了它?如果是,请不要禁用它。它不会 在发布数据时传递数据。
      3. (如果 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 我刚刚用谷歌翻译了你的答案。您应该用英语回答问题,以便我们大多数人可以使用您的有用想法和解决方案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2019-08-16
      • 2020-03-19
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多