SQL Server 实体框架核心修改时临时值错误

mctunoxg  于 2023-02-03  发布在  其他
关注(0)|答案(6)|浏览(129)

我正在学习ASP.NET核心和实体框架核心的教程。我能够连接到我的Microsoft SQL Server数据库并获取和添加行,但我不能更新它们。我的update方法附加了一个新用户,然后将状态设置为modified。
但每次我都得到错误:
系统操作无效异常:尝试将实体类型"UserData"的状态更改为"Modified"时,该实体类型的属性"Id"具有临时值。请显式设置永久值,或确保将数据库配置为生成此属性的值。
我试过将主键属性设置为数据库生成,并尽我所能在数据库中实现它,但我不确定它是否有效。我还试过使用FromSQL方法运行SQL更新,但没有任何变化(当我尝试删除时,我遇到了类似的问题,可能是单独的问题)。
下面是来自数据库上下文实现的update方法:

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

基本上我只是想用新的信息更新一个用户,我试着使用附件和实体。修改方法在教程中使用,但如果有一个更好的方法,我也开放。

    • EDIT**:答案在我标记为答案的注解中。在我的. cshtml页面上,我没有将用户ID绑定到输入字段,因此默认设置为"0"。
50pmv0ei

50pmv0ei1#

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

2ledvvac

2ledvvac2#

试试看

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

如果没有为您工作,请分享您的Page.cshtml。
您可能在更新行时更改了主键值

drkbr07n

drkbr07n3#

当ID未到达Update方法时,会发生此“实体框架核心修改期间的临时值错误”。
问题不在代码中。问题在视图中,您没有在这里附加它,但请在“视图”中查找以下内容。
1.确保表单中存在“ID”属性。
1.如果它存在,然后检查您是否已禁用它?如果是,不要禁用它。它不会传递数据时,您发布它。
1.(如果ID是主键)确保ID安全地到达Update方法而没有被更改。

gpnt7bae

gpnt7bae4#

我得到了同样的异常,当我有唯一的索引,AddRange失败的唯一索引,然后在捕获异常块是尝试删除整个插入.(不是我的代码,但我必须修复它:-))
代码示例(简化):

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

mlmc2os55#

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

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

并在<form method="post">标记中添加隐藏的Id输入。

ef1yzkbh

ef1yzkbh6#

如果我尝试删除一个还没有真正添加的对象,就会发生这种情况。EF希望我们从上下文中删除相关对象,而不仅仅是从nav属性中孤立它们,但是如果您从上下文中删除一个还没有在上下文中的对象(可能用户添加了一个项目,然后立即删除它),那么当您尝试删除它时,就会收到这个错误。
一个简单的解决方法是只从上下文中删除具有“真实的”主键的对象:

if (entity.ID > 0)
   context.Remove(entity);

相关问题