【发布时间】:2020-12-24 18:15:12
【问题描述】:
我有两个班级,Ignicoes 和 Ocorrencias: Ignicoes 类:
public class Ignicoes
{
public enum EstadoIgnicao
{
aceite,
emAvaliacao,
concluido,
recusado
}
public Ignicoes()
{
ListaOcorrencias = new HashSet<Ocorrencias>();
}
[Key]
[Required]
public int Id { get; set; }
[Required]
public string Latitude { get; set; }
[Required]
public string Longitude { get; set; }
//estado(recusada, aceite, em avaliacao, concluido)
[Required]
public EstadoIgnicao Estado { get; set; }
public DateTime DataInicioPropostaIgnicao { get; set; }
public DateTime DataDecisaoIgnicao { get; set; }
//lista de ocorrencias
public virtual ICollection<Ocorrencias> ListaOcorrencias { get; set; }
}
Ocorrencias 类:
public class Ocorrencias
{
public enum EstadoOcorrencia
{
aceite,
emAvaliacao,
recusado
}
[Key]
public int Id { get; set; }
/// <summary>
/// código que identifica de forma única o aparelho que comunica a ocorrência
/// </summary>
[Required]
public string Dispositivo { get; set; }
/// <summary>
/// data da ocorrencia
/// </summary>
[Required]
public DateTime DataOcorrencia { get; set; }
/// <summary>
/// coordenadas GPS - Latitude
/// </summary>
[Required]
public string Latitude { get; set; }
/// <summary>
/// coordenadas GPS - Logitude
/// </summary>
[Required]
public string Longitude { get; set; }
/// <summary>
/// Azimute do ?angulo formado entre o Polo Norte e o fogo
/// </summary>
[Required]
public string Azimute { get; set; }
/// <summary>
/// Foto a provar a ocorrência
/// </summary>
[Required]
public string Fotografia { get; set; }
/// <summary>
/// Nome a atribuir à fotografia guardada no disco rígido
/// </summary>
public string NomeFotografia { get; set; }
/// <summary>
/// estado da ocorrencia : aceite, em avaliação, recusado
/// </summary>
[Required]
public EstadoOcorrencia Estado { get; set; }
[ForeignKey("Ignicao")]
[Display(Name = "Ignicao")]
public int? IgnicaoFK { get; set; }
public virtual Ignicoes Ignicao { get; set; }
}
如您所见,每个 Ignicao 都有一个 Ocorrencias 列表。 我通过调用 PUT 方法的 ajax 请求更新了 Ignicao 的属性“Estado”
function atualizaBD(idmarcador, novoEstado, latitude, longitude) {
$.ajax
({
url: `/api/IgnicoesAPI/${idmarcador}`,
type: 'PUT',
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: JSON.stringify({
Id: idmarcador,
Estado: novoEstado,
Latitude: latitude,
Longitude: longitude
}),
async: true,
processData: false,
cache: false,
success: function (result) {
connection.invoke("PostMarker").catch(function (err) {
return console.error(err.toString());
});
},
error: function () {
alert(novoEstado)
}
});
}
这是我的 PUT 方法:
public async Task<IActionResult> PutIgnicoes([FromRoute] int id, [FromBody] Ignicoes ignicao)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != ignicao.Id)
{
return BadRequest();
}
else
{
var dataDecisao = DateTime.Now;
var ig = _context.Ignicoes.FirstOrDefault(ignicaoId => ignicaoId.Id.Equals(id));
if (ig != null)
{
ig.Estado = ignicao.Estado;
//é necessário mudar o estado das ocorrencias que fazem parte da lista de ocorrencias desta ignição
var listaOocrrencias = ig.ListaOcorrencias.ToList();
for(int i=0; i < listaOocrrencias.Count;i++)
{
if (ignicao.Estado == Ignicoes.EstadoIgnicao.aceite)
{
ig.ListaOcorrencias.ElementAt(i).Estado = Ocorrencias.EstadoOcorrencia.aceite;
}
else
{
if (ignicao.Estado == Ignicoes.EstadoIgnicao.recusado)
{
ig.ListaOcorrencias.ElementAt(i).Estado = Ocorrencias.EstadoOcorrencia.recusado;
}
}
}
ig.Latitude = ignicao.Latitude;
ig.Longitude = ignicao.Longitude;
ig.DataDecisaoIgnicao = dataDecisao;
}
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!IgnicoesExists(id))
{
return NotFound();
}
else
{
throw;
}
}
}
return NoContent();
}
我在 PUT 方法中尝试做的是,每当更改 Ignicao 的属性“Estado”时,同时更改属性 ListaOcorrencias 中每个 Ocorrencia 的属性 Estado。 现在我在 PUT 方法中显示的代码。它不会给我一个错误,但是当我尝试调试时,它会跳过它在循环内的代码。 为什么会这样?
【问题讨论】:
-
您确定
ig.ListaOcorrencias集合是从数据库中提取的吗?自从我完成 EF 以来已经有一分钟了,但我认为需要启用延迟加载才能使您的代码正常工作。您也可以使用Include像这样急切地加载相关集合:_context.Ignicoes.Include(i => i.ListaOccurrencias).FirstOrDefault(ignicaoId => ignicaoId.Id.Equals(id)); -
太棒了!我把它移到一个答案。如果您对它感到满意,请选择它作为解决方案,这样我就可以获得那些甜蜜的虚假互联网积分:)
标签: c# ajax asp.net-mvc asp.net-core put