2017-03-31 76 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