Временная ошибка значения при модификации ядра Entity Framework - PullRequest
1 голос
/ 30 апреля 2019

Я читал учебное пособие по ASP.NET Core и Entity Framework Core. Я могу подключиться к своей базе данных Microsoft SQL Server, получить и добавить строки, но не могу их обновить. Мой метод обновления присоединяет нового пользователя, а затем устанавливает состояние для изменения.

Каждый раз, когда я получаю сообщение об ошибке:

System.InvalidOperationException: «Свойство Id» для типа объекта «UserData» имеет временное значение при попытке изменить состояние объекта на «Изменено». Либо задайте постоянное значение явно, либо убедитесь, что база данных настроена для генерации значений для этого свойства. '

Я попытался установить свойство первичного ключа для сгенерированной базы данных и приложил все усилия, чтобы реализовать это в базе данных, но я не уверен, что оно работает. Я также попытался запустить обновление SQL с помощью метода FromSQL, но ничего не изменилось (у меня есть похожая и, вероятно, отдельная проблема, когда я пытаюсь удалить).

Вот метод обновления из реализации контекста БД:

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 я не связывал идентификатор пользователя с полем ввода, поэтому по умолчанию он был установлен на «0».

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Попробуйте

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

Если это не помогло вам, поделитесь своими Page.cshtml.

Возможно, вы меняете значение первичного ключа при обновлении строки

0 голосов
/ 18 июля 2019

Я получил то же исключение, когда у меня был уникальный индекс, 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...