问题描述
我有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,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方法中显示的代码。它没有给我一个错误,但是当我尝试调试时,它会跳过循环内的代码。 为什么会这样?
解决方法
根据以上评论, const routes: Routes = [
{path: '',redirectTo: 'home-component',pathMatch: 'full'},{ path: 'home-component',component: HomeComponent },{ path: 'steps-component',component: StepsComponent,children:[
{ path: 'welcome-component',component:WelcomeComponent,outlet:'step' },{ path: 'step1-component',component: Step1Component,{ path: 'step2-component',component: Step2Component,]
},];
集合未从数据库中合并。必须启用延迟加载才能使上述代码正常工作。您还可以急于使用Include这样加载相关集合:ig.ListaOcorrencias
,在这里是一个很好的解决方案,因为您总是想加载相关集合。
进一步阅读:
https://docs.microsoft.com/en-us/ef/core/querying/related-data