我有两个表(Device
和PropertyValue
),当我尝试删除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);
答案 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)
。应该可以。