2011-08-21 65 views
0

我試圖從數據庫中刪除的項目,但我得到以下異常:的SaveChanges問題

"DbUpdateException was unhandled" 

------------------------------------------------------------ 
public class Project 
{ 
    public Project() 
    { 
     Customers = new List<Customer>(); 
     Materials = new List<Material>(); 
     Workers = new List<Worker>(); 
    } 

    [Key] 
    public long ProjectID { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateFinished { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 

    //Customer TheCustomer = new Customer(); 

    public ICollection<Customer> Customers { get; set; } 
    public ICollection<Material> Materials { get; set; } 
    public ICollection<Worker> Workers { get; set; } 
} 

------------------------------------------------------------------------ 
if (cb_Projects.SelectedValue != null) 
{ 
    using (var db = new ProjectContext()) 
    { 

     Project p = db.Projects.Find(cb_Projects.SelectedValue); 
     if (db.Entry(p).State == EntityState.Detached) 
     { 
      db.Projects.Attach(p); 
     } 

     p.Customers.Clear(); 
     p.Workers.Clear(); 
     p.Materials.Clear(); 
     db.Projects.Remove(p); 
     db.SaveChanges(); 
+2

發佈'DbUpdateException'的內部異常消息 – Eranga

+0

您發佈的代碼似乎不完整。 – Tim

+0

我想你有一些更小/更大的字符 - 使用&gt或&lt而不是那些字符 – Carsten

回答

3

當你叫這個:

p.Customers.Clear(); 
p.Workers.Clear(); 
p.Materials.Clear(); 

你沒有注意到,因爲它只能工作,如果集合而且如果這些關係是一對多關係,則還需要對每個從屬實體進行關聯(請致電Remove)。爲了填充這些藏品,你必須使用預先加載

long selectedValue = cb_Projects.SelectedValue; 
Project p = db.Projects.Include(p => p.Customers) 
         .Include(p => p.Workers) 
         .Include(p => p.Materials) 
         .Single(p => p.ProjectID == selectedValue); 

或標記所有三個屬性爲virtual啓用延遲加載。

您的當前代碼應該通過級聯刪除來處理。

這也沒有多大意義:

if (db.Entry(p).State == EntityState.Detached) 
{ 
    db.Projects.Attach(p); 
} 

您正在尋找上下文的新實例的項目,所以它總是會從數據庫加載,並且其狀態將是Unchanged