2013-03-25 95 views
1

我有一种方法可以删除数据库中的“项目”记录以及与其关联的所有“选项”。在Entity Framework中,如何使用外键约束删除记录?

public bool DeleteProjectById(int id) 
{ 
    using (DbContext db = new DbContext(ConfigHelper.Instance().ConnectionString)) 
    { 
     try 
     { 
      foreach (var entity in db.ProjectOptionItems.Where(o => o.ProjectId == id)) 
       db.ProjectOptionItems.DeleteObject(entity); 

      db.SaveChanges(); 

      var project = db.Projects.SingleOrDefault(o => o.Id == id); 
      db.Projects.DeleteObject(project); 

      db.SaveChanges(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      ErrorLoggingService.Log(this, e); 
      return false; 
     } 
    } 
} 

这工作正常。但是如果我第一次调用db.SaveChanges,这是我希望代码将如何的方式,这将导致SQL异常(DELETE语句与REFERENCE约束条件冲突)。

有两个调用SaveChanges()的作品,但肯定不是这样做的。请帮忙。谢谢!

+3

,你不需要所有的foreach循环,这是一个可能的解决方案。 – 2013-03-25 08:20:17

+0

您需要先清除子集合 – 2013-03-25 08:20:51

+0

@aliriza,谢谢 – Ronald 2013-03-25 08:28:45

回答

5

就像AliRiza说的那样,把它设置在你的SQL服务器上。此外,在您的DbContext课堂上使用这样的:在你的数据库,如果你设置删除级联

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ProjectOptionItems>().WillCascadeOnDelete(); 
} 
+0

什么是ProjectOptionItems?请求参考,但不告诉我如何解决。 – nzondlo 2013-11-01 14:05:09

+0

@nzondlo:查看原始帖子的代码。 Ronalds对象名称是“ProjectOptionItem”。将其替换为要级联的对象。 – 2013-11-01 17:29:08

+0

谢谢,但我在VS2010中使用Entity 4.x,我认为我没有选择使用它。现在也打算使用存储过程来处理删除(这是另一个故事) – nzondlo 2013-11-04 04:22:48