2011-08-21 62 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