2017-03-31 47 views
1

我有2个实体由一对多的关系连接如下(I第一次使用码):使用EF禁用级联删除?

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): The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.Screen_dbo.Computer_ComputerId". The conflict occurred in database "CPInventory", table "dbo.Screen", column 'ComputerId'.

我已经看了很多帖子,我试过两件事情,似乎已经工作了他人。我改变了“OnModelCreating”的方法,并补充说:

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"); 
    } 
+0

流利的配置是好的,问题是不同的。你能分享删除代码吗? –

回答

0

您无法删除屏幕有ComputerId与计算机的ComputerId相匹配的计算机。

所以更新屏幕:

screen.ComputerId = null; 

然后删除您的计算机

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

然后保存更改

db.SaveChanges(); 
+0

谢谢@Erik!我会在星期一回去工作后立即尝试这个! :) – Pookye

+0

谢谢!其实我用@David提出的答案:stackoverflow.com/a/33914071/532616我认为它与你的建议大致相同!谢谢 ! – Pookye

0

的问题是你在说你不能删除父行(计算机)是否有子行(数据库中的外键约束屏幕)在数据库中。

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

您唯一的选择是在删除计算机之前删除具有相同ComputerID的所有屏幕。 (或者为什么不只是打开级联删除并让框架为您执行)

+0

谢谢大卫。问题是即使我删除了电脑,我也想保留屏幕,并且级联甚至没有打开。我只是无法删除电脑。 – Pookye

+0

我会建议使用软删除(http://stackoverflow.com/questions/2549839/are-soft-deletes-a-good-idea)你实际上并没有删除计算机,而是有点列删除到表并将其设置为“已删除”计算机的True。 – David

+0

或者,这个答案看起来像你想要的:http://stackoverflow.com/a/33914071/532616 – David