Я использую Asp .Net Core Razor Pages, и я создал модель, используя CRUD, и сгенерировал мне страницы для создания, редактирования, удаления и т.д. ...
Проблема в том, что все они работают, кроме редактирования.
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Attach(Utilizador).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UtilizadorExists(Utilizador.UserID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToPage("./Index");
}
всякий раз, когда он нажимает сохранить изменения, он дает исключение при попытке вставить
SqlException: Невозможно вставить строку повторяющегося ключа в объект
'dbo.xColaboradores' с уникальным индексом 'IX_xColaboradores_UserID'.
значение дубликата ключа (8). Заявление было прекращено.
вот модели
public class Colaborador
{
[Key]
[ForeignKey("Utilizador")]
public int ColaboradorID { get; set; }
public string Nome { get; set; }
public string Email { get; set; }
public int UserID { get; set; }
public virtual Utilizador Utilizador { get; set; }
public int DepartamentoID { get; set; }
public virtual Departamento Departamento { get; set; }
}
public class Utilizador
{
[Key]
[ForeignKey("Colaborador")]
public int UserID { get; set; }
public string Username { get; set; }
public bool IsActivo { get; set; }
public DateTime? UltimoAcesso { get; set; }
public virtual Colaborador Colaborador { get; set; }
}
Я пытался присоединить связанные сущности, но это дает еще одно исключение
InvalidOperationException: свойство 'ColaboradorID' для типа объекта
«Колаборадор» имеет временное значение при попытке изменить
состояние сущности на «Без изменений». Либо установить постоянное значение явно
или убедитесь, что база данных настроена для генерации значений для этого
свойство.
EDIT
Я до сих пор не уверен, как это работает на платформе сущностей, но кажется, что он получает объект непосредственно со страницы, которая связана.
Я заметил, что некоторые свойства не имеют значений, таких как идентификаторы связанной сущности. они были в 0, следовательно, почему он пытался вставить. Чтобы это исправить, мне пришлось поместить первичные и внешние идентификаторы в скрытый ввод, или он попытается вставить их и выдаст дубликат исключения
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Utilizador.UserID" />
<input type="hidden" asp-for="Utilizador.Colaborador.ColaboradorID" />
<input type="hidden" asp-for="Utilizador.Colaborador.UserID" />
<div class="form-group">
<label asp-for="Utilizador.Username" class="control-label"></label>
<strong class="text-danger">*</strong>
<input asp-for="Utilizador.Username" class="form-control form-control-sm" />
<span asp-validation-for="Utilizador.Username" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Utilizador.Colaborador.Nome" class="control-label"></label>
<strong class="text-danger">*</strong>
<input asp-for="Utilizador.Colaborador.Nome" class="form-control form-control-sm" />
<span asp-validation-for="Utilizador.Colaborador.Nome" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Utilizador.Colaborador.Email" class="control-label"></label>
<strong class="text-danger">*</strong>
<input asp-for="Utilizador.Colaborador.Email" class="form-control form-control-sm" />
<span asp-validation-for="Utilizador.Colaborador.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Utilizador.Colaborador.Departamento.Designacao" class="control-label"></label>
<strong class="text-danger">*</strong>
<select asp-for="Utilizador.Colaborador.DepartamentoID" asp-items="Model.DepartamentosList" class="form-control form-control-sm">
<option value="">Selecione um departamento</option>
</select>
<span asp-validation-for="Utilizador.Colaborador.DepartamentoID" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Guardar" class="btn btn-block text-white text-uppercase text-bold" style="background-color:#124475; box-shadow:0 5px 5px 0 rgba(0, 0, 0, 0.2), 0 8px 5px 0 rgba(0, 0, 0, 0.19);" />
</div>
</form>
и на задней части
_context.Attach(Utilizador).State = EntityState.Modified;
_context.Attach(Utilizador.Colaborador).State = EntityState.Modified;
с этим я могу изменить связанный объект, и он обновляется нормально.
Не уверен, что это лучшая практика, потому что я пытался изменить значение в браузере с помощью инструментов dev, и это можно легко взломать, или если есть другой способ получить эти значения без сохранения их при скрытом вводе, но я заметил, что сгенерированный Страницы элементов лесов уже хранили идентификатор первичного ключа на скрытом вводе.