实体框架核心修改期间的临时值错误

时间:2019-04-29 23:00:51

标签: c# sql-server asp.net-core entity-framework-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;
}

我使用另一种方法(在此方法之后直接调用)进行保存更改。

这是我的数据模型:

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; }
}

基本上,我只想用新信息更新用户,而我正在尝试使用attach和entity。我正在遵循的教程中使用的Modify方法,但是如果有更好的方法,我也愿意接受。

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

5 个答案:

答案 0 :(得分:3)

当ID未到达更新方法时,会发生此“实体框架核心修改期间的临时值错误”。

问题不在代码中。问题在于您尚未在此处附加视图,而是在“视图”中查找以下内容。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

尝试

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

如果对您不起作用,请共享您的Page.cshtml。

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

答案 3 :(得分:0)

当我有唯一索引时,我遇到了同样的异常,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;
}

答案 4 :(得分:-1)

解决方案是编辑 .cshtml 文件。
我认为已删除或需要更改的一行是:

<input type="hidden" asp-for="Persona.Id" />

Screenshot of code