Как предотвратить присвоение временного значения при редактировании записи с EntityFramework? - PullRequest
1 голос
/ 23 мая 2019

Я создал страницу редактирования для записи, при сохранении я получаю следующую ошибку:

Свойство «Id» для типа объекта «LoadTable» имеет временное значение при попытке изменить объектсостояние «Модифицировано».Либо задайте постоянное значение явно, либо убедитесь, что база данных настроена для генерации значений для этого свойства.

Я думаю, что ему может быть присвоено временное значение, а не используется существующее.

Отмой Edit.cs:

[BindProperty]
public LoadTable LoadTable { get; set; }

public async Task<IActionResult> OnGetAsync(Guid id)
{
       if (id == null)
       {
            return NotFound();
       }
       LoadTable = await _context.LoadTable.FirstOrDefaultAsync(m => m.Id == id);

       if (LoadTable == null)
       {
            return NotFound();
       }
       return Page();
}

public async Task<IActionResult> OnPostAsync()
{
       if (!ModelState.IsValid)
       {
            return Page();
       }

       _context.Attach(LoadTable).State = EntityState.Modified;

       try
       {
            await _context.SaveChangesAsync();
       }
       catch (DbUpdateConcurrencyException)
       {
            if (!LoadTableExists(LoadTable.Id))
            {
                 return NotFound();
            }
            else
            {
                throw;
            }
        }
    return RedirectToPage("./Index");
}

private bool LoadTableExists(Guid id)
{
    return _context.LoadTable.Any(e => e.Id == id);
}

из контекста:


entity.Property(e => e.Id).HasDefaultValueSql("(newid())");

из модели:

public partial class LoadTable
{
    public Guid Id { get; set; }
}

1 Ответ

1 голос
/ 23 мая 2019

Я подозреваю, что у свойства Id нет соответствующего поля в форме.

Я не совсем в курсе того, как работают страницы Razor (это то, что вы используете, верно?)

Однако я подозреваю, что когда GET указывает на страницу, свойство LoadTable устанавливается и его свойства используются внутри представления, чтобы заполнить форму текущими значениями.
Затем, когда форма отправлена, платформа создает новый экземпляр класса LoadTable, затем она берет значения из запроса и устанавливает соответствующие свойства в (новом) экземпляре LoadTable.
Но поскольку в форме нет поля идентификатора, оно не может установить свойство идентификатора, и поэтому просто имеет значение по умолчанию.

Если мои предположения верны, то решение состоит в том, чтобы добавить новое поле (вы можете сделать его скрытым, если хотите) в форму и установить значение для идентификатора LoadTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...