表上的EF Core删除违反了表上的外键约束

时间:2018-10-25 07:30:51

标签: c# entity-framework-core

我有两个表(DevicePropertyValue),当我尝试删除Device时,出现一个异常:

  

违反外键

我还尝试在OnModelCreating()上设置级联,但仍然无法正常工作。

public class Device
{
    public int Id { get; set; }
    public List<PropertyValue> Properties { get; set; }
}

public class PropertyValue
{
    public int Id { get; set; }
    public int? DeviceId { get; set; }
    public Device Device { get; set; }
}

modelBuilder.Entity<PropertyValue>()
    .HasOne(p => p.Device)
    .WithMany(b => b.Properties)
    .HasForeignKey(w => w.DeviceId)
    .OnDelete(DeleteBehavior.Cascade);  

编辑:我正在使用存储库,但基本上我正在使用_context.Devices.Remove(entity);

删除

3 个答案:

答案 0 :(得分:2)

由于FK属性.OnDelete(DeleteBehavior.Cascade)可为空,因此关系为optional,该关系到default已关闭了删除级联。

因此添加{ "error" : "invalid_request", "error_description" : "Missing header: Content-Type" } 是朝正确方向迈出的一步。

但是,如果您最初没有这样做,并且已经创建了表和关系,则必须确保将其也应用到数据库中(因为级联删除EF通常依赖于数据库来实现),通过生成新的迁移并更新数据库。

答案 1 :(得分:1)

如果上下文未加载和跟踪Properties集合中的相关实体,则不会删除它们。推荐的方法是也对数据库中的外键约束设置一个级联操作,如DeleteBehavior的文档中所述:

https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.metadata.deletebehavior

如果使用EF自动创建架构,则也会生成该内容。

答案 2 :(得分:0)

public int? DeviceId { get; set; } 

定义属性名称DeviceId,并且此属性允许为null。尝试从中删除?字符并删除部分.HasForeignKey(w => w.DeviceId)。应该可以。