使用 EF 禁用级联删除



我有 2 个实体通过一对多关系链接如下(我先使用代码(:

public class Computer
{
    [Key]
    public int ComputerId { get; set; }
    [Required]
    public int ComputerIdInventory { get; set; }
    [DataType(DataType.Date)]
    public DateTime? AcquisitionDate { get; set; }
    [DataType(DataType.Date)]
    public DateTime? LastUpdate { get; set; }
    public string Comment { get; set; }
    //Foreign keys
    public int? ComputerModelId { get; set; }
    public int? EmployeeId { get; set; }
    //Navigation properties
    public virtual ICollection<Screen> Screens { get; set; }
}
public class Screen
{
    [Key]
    public int ScreenId { get; set; }
    [Required]
    public int ScreenIdInventory { get; set; }
    public string Comment { get; set; }
    //Foreign keys
    public int? ComputerId { get; set; }
    //Navigation properties
    public virtual Computer Computer { get; set; }
}

当我删除链接到一个或多个屏幕的计算机时,出现以下错误:

[SqlException (0x80131904(:DELETE 语句与 REFERENCE 约束"FK_dbo.Screen_dbo。Computer_ComputerId"。冲突发生在数据库"CPInventory",表"dbo。屏幕",列"计算机 ID"。

读过很多帖子,我尝试了 2 件似乎对其他人有用的事情。我更改了"OnModelCreateating"方法并添加了:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

我也试过这个:

modelBuilder.Entity<Computer>()
            .HasMany<Screen>(c => c.Screens)
            .WithOptional(s => s.Computer)
            .WillCascadeOnDelete(false);

但是没有一个解决方案奏效...我做错了什么吗?我还更新了数据库,但没有任何变化。我是否必须完全删除数据库并重新创建它才能考虑这些更改?

非常感谢 !

编辑:这是删除代码

public ActionResult DeleteConfirmed(int id)
    {
        Computer computer = db.Computers.Find(id);
        db.Computers.Remove(computer);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

如果屏幕的ComputerId与计算机的ComputerId匹配,则无法删除

计算机。

因此,请更新屏幕:

screen.ComputerId = null;

然后删除电脑

db.Set<Computer>().Remove(computer);

然后保存更改

db.SaveChanges();

问题是数据库中有一个外键约束,该约束表示如果数据库中有子行(屏幕(,则无法删除父行(计算机(。

这就是您首先具有级联删除功能的原因,因此删除计算机也会删除屏幕。

您唯一的其他选择是在删除计算机之前删除具有相同计算机ID的所有屏幕。 (或者为什么不直接打开级联删除并让框架为您完成(

相关内容

  • 没有找到相关文章

最新更新