Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心修改期间出现临时值错误_C#_Sql Server_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 实体框架核心修改期间出现临时值错误

C# 实体框架核心修改期间出现临时值错误,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我一直在学习ASP.NET核心和实体框架核心的教程。我可以连接到我的Microsoft SQL Server数据库并获取和添加行,但无法更新它们。我的更新方法附加一个新用户,然后将状态设置为“已修改” 尽管每次我都会出错: System.InvalidOperationException:“试图将实体状态更改为“已修改”时,实体类型“UserData”上的属性“Id”具有临时值。请显式设置永久值,或确保数据库配置为生成此属性的值。” 我已经尝试将主键属性设置为database generated

我一直在学习ASP.NET核心和实体框架核心的教程。我可以连接到我的Microsoft SQL Server数据库并获取和添加行,但无法更新它们。我的更新方法附加一个新用户,然后将状态设置为“已修改”

尽管每次我都会出错:

System.InvalidOperationException:“试图将实体状态更改为“已修改”时,实体类型“UserData”上的属性“Id”具有临时值。请显式设置永久值,或确保数据库配置为生成此属性的值。”

我已经尝试将主键属性设置为database generated,并尽力在数据库中实现它,但我不确定它是否有效。我还尝试使用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;
}
基本上,我只想用新信息更新用户,我正在尝试使用attach和entity。修改我在下面的教程中使用的方法,但如果有更好的方法,我也愿意这样做

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

试试看

    public UserData Update(UserData updatedUser)
    {
        var entity = db.Users.Attach(updatedUser);
        entity.Entry(updatedUser).State = EntityState.Modified;
        entity.SaveChanges(); 
        return updatedUser;
    }
如果不适合您,请分享您的Page.cshtml


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

当我有唯一索引时,我得到了相同的异常,AddRange在唯一索引上失败,然后在catch异常块内尝试删除整个插入的。 (不是我的代码,但我必须修复它:-))

代码示例(简化):

试试看{
context.AddRange(users);//列表,具有属性列表
context.SaveChanges();//在唯一索引上引发异常
}捕获(例外情况除外){
context.RemoveRange(users);//这会引发异常“实体类型“Contact”上的属性“UserID”具有临时值”
投掷;
}
此“实体框架核心修改期间的临时值错误”发生在ID未到达更新方法时

问题不在代码中。问题在于视图中没有将其附加到此处,但请在“视图”中查找以下内容

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

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

    解决方案是编辑.cshtml文件。
    我想有一行被删除了,或者需要做一些更改:

    
    

    对不起,我不知道“操作视图”是什么。虽然我尝试过,但在到达任何save语句之前,仍然会出现异常错误。如果您需要使用此方法的.cshtml文件和.cs文件,可以在以下位置查看:和:you not binding id,在您的编辑页面中。cshtml因为您的id字段是int,并且它在更新方法中分配了“0”,正如Muhammad Moid Shams所说,问题是“您没有绑定id”。更好的解决方案可能是在Edit.cshtml中的
    下添加
    。您的响应就是解决方案。这个错误实际上是不言自明的。我只是遇到了同样的错误。我所做的是在表单中包含ID字段并传递值。这实际上解决了问题感谢这一点,使用AddRange遇到了同样的问题。马塞洛:我刚刚用谷歌翻译了你的答案。你应该用英语回答这个问题,这样我们大多数人都可以使用你的有用的想法和解决方案。非常感谢。
        public UserData Update(UserData updatedUser)
        {
            var entity = db.Users.Attach(updatedUser);
            entity.Entry(updatedUser).State = EntityState.Modified;
            entity.SaveChanges(); 
            return updatedUser;
        }
    
    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;
    }