我正在使用 Entity Framework。在我的模型中,我设置了一个可空的外键,它似乎在数据库中正确反映出来了。这是我的 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; }
}
如您所见,SubtypeID
和导航属性都设置为可空,表中的列也正确设置为可空。插入新的时Asset
,它接受SubtypeID
为 NULL,但是,在更新已存在的Asset
以使 为 NULL 时SubtypeID
,我收到以下错误:
SqlException:UPDATE 语句与 FOREIGN KEY 约束“FK_Assets_Subtypes_SubtypeID”冲突。冲突发生在数据库“assetinventory”、表“dbo.Subtypes”、列“TypeID”中。
以下是引发该异常的方法的一部分:
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();
}
方法调用时引发异常SaveChangesAsync
。
我尝试了在这里找到的很多东西,询问了 ChatGPT,什么都试过了。不明白为什么会发生这种情况。我接下来可以尝试什么?