Comment empêcher EF.core d'essayer d'insérer / de mettre à jour des tables de clés étrangères lorsque nous créons une nouvelle entité principale?
Cette exception est levée:
SqlException: Cannot insert explicit value for identity column in table 'clients' when IDENTITY_INSERT is set to OFF.
Cannot insert explicit value for identity column in table 'guards' when IDENTITY_INSERT is set to OFF.
Cannot insert explicit value for identity column in table 'penalties' when IDENTITY_INSERT is set to OFF.
Mon code est le suivant:
public class Offence
{
[Key]
public Int32 offence_id { get; set; }
public Int32? guard_id { get; set; }
public Int32? penalty_id { get; set; }
public DateTime? dt_recorded { get; set; }
public Int32? salary_id { get; set; }
public Decimal? amount { get; set; }
public String status { get; set; }
public Int32? site_id { get; set; }
public Guard Guard { get; set; }
public Salary Salary { get; set; }
public Site Site { get; set; }
public Penalty Penalty { get; set; }
}
Toute tentative de création d'une nouvelle Offence
génère des erreurs, car EF.core tente d'exécuter des insertions pour les propriétés de navigation associées:
public Guard Guard { get; set; }
public Salary Salary { get; set; }
public Site Site { get; set; }
public Penalty Penalty { get; set; }
Comment pouvons-nous empêcher cela?
Edit: Créer et mettre à jour le code
[HttpPost]
public async Task<IActionResult> Create([FromBody] Offence o)
{
if (o == null)
{
return BadRequest();
}
o.last_modified_by = int.Parse(((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value);
o.last_modified = DateTime.Now;
await db.AddAsync(o);
await db.SaveChangesAsync();
return CreatedAtRoute("GetOffenceAsync", new { id = o.offence_id }, o);
}
Il semble que vos propriétés de navigation aient des valeurs. Vérifiez que votre propriété de navigation a une référence nulle avant de sauvegarder; La logique de sauvegarde de EF Core essaie de sauvegarder les propriétés de navigation si elles ont une valeur.
Faites-moi savoir si cela est utile
Pour que cela fonctionne, je devais null-out
les propriétés de navigation avant de sauvegarder.
Toutefois, si vous CreatedAtRoute
objet initial avec CreatedAtRoute
, vous devez alors mettre en cache les propriétés à valeur nulled-out
et les rajouter avant de retourner:
Code actuel:
[HttpPost]
public async Task<IActionResult> Create([FromBody] Offence o)
{
if (o == null)
{
return BadRequest();
}
o.last_modified_by = int.Parse(((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value);
o.last_modified = DateTime.Now;
var _g = o.Guard;
var _p = o.Penalty;
var _s = o.Site;
o.Guard = null;
o.Penalty = null;
o.Site = null;
await db.AddAsync(o);
await db.SaveChangesAsync();
o.Guard = _g;
o.Penalty = _p;
o.Site = _s;
return CreatedAtRoute("GetOffenceAsync", new { id = o.offence_id }, o);
}