Estou usando o Entity Framework. No meu modelo, tornei uma chave estrangeira anulável, e parece que ela está refletida corretamente no banco de dados. Aqui está parte da minha classe de modelo Asset:
public class Asset
{
[Key]
public int AssetID { get; set; }
[Required]
[MaxLength(100)]
public string AssetName { get; set; }
[Required]
public int AssetTypeID { get; set; }
[ForeignKey("AssetTypeID")]
public AssetType AssetType { get; set; }
public int? SubtypeID { get; set; }
[ForeignKey("SubtypeID")]
public Subtype? Subtype { get; set; }
}
Como você pode ver, a SubtypeID
propriedade e a propriedade de navegação estão ambas definidas como anuláveis, e a coluna na tabela está corretamente definida como anulável também. Ao inserir um novo Asset
, ele aceita SubtypeID
como NULL, no entanto, ao atualizar um já existente Asset
para ter NULL para SubtypeID
, recebo o seguinte erro:
SqlException: A instrução UPDATE entrou em conflito com a restrição FOREIGN KEY "FK_Assets_Subtypes_SubtypeID". O conflito ocorreu no banco de dados "assetinventory", tabela "dbo.Subtypes", coluna 'TypeID'.
Aqui está parte do método que lança essa exceção:
var updatedAsset = viewModel.Asset;
using (var scope = App.ServiceProvider.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<AssetDbContext>();
SelectedAsset.AssetName = updatedAsset.AssetName;
SelectedAsset.AssetTypeID = updatedAsset.AssetTypeID;
SelectedAsset.AssetType = updatedAsset.AssetType;
if (updatedAsset.SubtypeID == -1)
{
SelectedAsset.SubtypeID = null;
SelectedAsset.Subtype = null;
}
else
{
SelectedAsset.SubtypeID = updatedAsset.SubtypeID;
SelectedAsset.Subtype = updatedAsset.Subtype;
}
SelectedAsset.Owner = updatedAsset.Owner;
SelectedAsset.Location = updatedAsset.Location;
SelectedAsset.PurchaseDate = updatedAsset.PurchaseDate;
SelectedAsset.Value = updatedAsset.Value;
SelectedAsset.Status = updatedAsset.Status;
SelectedAsset.Description = updatedAsset.Description;
context.Assets.Update(SelectedAsset);
var log = new AssetLog
{
AssetID = SelectedAsset.AssetID,
Action = "Updated",
Timestamp = DateTime.Now,
PerformedBy = AuthenticationService.Instance.CurrentUser.GetTenantProfiles().ElementAt(0).Oid
};
context.AssetLogs.Add(log);
await context.SaveChangesAsync();
}
A exceção é lançada na SaveChangesAsync
chamada do método.
Tentei um monte de coisas que encontrei aqui, perguntei ao ChatGPT, tudo. Não consegui entender por que isso pode estar acontecendo. O que posso tentar em seguida?