6

开始了新的ASP.NET MVC 3应用程序时遇到以下错误:如何使用外键约束删除记录?

The primary key value cannot be deleted because references to this key still exist.

如何解决这个问题?

模型(EF代码优先)

public class Journal 
{ 
    public int JournalId { get; set; } 
    public string Name { get; set; } 
    public virtual List<JournalEntry> JournalEntries { get; set; } 
} 
public class JournalEntry 
{ 
    public int JournalEntryId { get; set; } 
    public int JournalId { get; set; } 
    public string Text { get; set; } 
} 

控制器

// 
// POST: /Journal/Delete/5 

[HttpPost, ActionName("Delete")] 
public ActionResult DeleteConfirmed(int id) 
{    
    Journal journal = db.Journals.Find(id); 
    db.Journals.Remove(journal); 
    db.SaveChanges(); // **exception occurs here** 
    return RedirectToAction("Index"); 
} 

DB设置

public class FoodJournalEntities : DbContext 
{ 
    public DbSet<Journal> Journals { get; set; } 
    public DbSet<JournalEntry> JournalEntries { get; set; } 
} 
+1

在数据库中可以为父表选择级联删除选项吗? – Pankaj 2012-03-17 18:04:10

+0

您的答案可能已经[在此](http://stackoverflow.com/a/5522422/60761)。如果不是,请发布DbSetup代码。您可以删除视图。 – 2012-03-17 18:04:40

+0

@PankajGarg - 我确认数据库已经有这个集合。 – 2012-03-17 18:17:01

回答

15

找到了解决办法:

public class FoodJournalEntities : DbContext 
{ 
    public DbSet<Journal> Journals { get; set; } 
    public DbSet<JournalEntry> JournalEntries { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Journal>() 
       .HasOptional(j => j.JournalEntries) 
       .WithMany() 
       .WillCascadeOnDelete(true); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Source

+0

哦,太棒了,你回答了你自己:) – 2012-03-17 18:37:56

+0

+1积分 – 2012-03-17 18:38:35

+0

@白ジェームス你真的是“13”岁吗? – 2012-03-17 18:44:15

7

如果删除REC ord从一个表(可以说是“blah”),它与其他表(xyz,abc)有其他关系。默认情况下,如果其他表中有相关​​行,数据库将阻止您删除“blah”中的行。
解决方案#1:
您可以手动先删除相关行,这可能需要大量的工作。
解决方案#2:
一个简单的解决方案是将数据库配置为在删除“blah”行时自动删除它们。

按照此打开数据库图表,然后单击属性的关系

enter image description here

在属性窗口中,展开INSERTUPDATE规格和设置DeleteRule属性到Cascade。
enter image description here

保存并关闭该图。如果询问您是否要更新数据库,请单击是。

要确保模型使内存中的实体与数据库正在执行的操作保持同步,您必须在数据模型中设置相应的规则。打开SchoolModel.edmx,右键单击“blah”和“xyz”之间的关联线,然后选择“属性”。

在属性窗口,展开INSERTUPDATE规格和设置DeleteRule属性级联。

Solution and images taken from http://www.asp.net/web-forms/tutorials/getting-started-with-ef/the-entity-framework-and-aspnet-getting-started-part-2

+0

此解决方案适用于EF 4.1之前的版本。数据库已经设置好了。 – 2012-03-17 18:18:04

-1

我发现它...

转至SQL服务器

使他的数据库图解

右键单击父母和孩子之间的关系,船行,并打开它的属性。

设置INSERT和更新规范,并简单地将DELETE RULE设置为CASCADE。

记住Project for FOR PURPOSE无需代码,只需调试并享受它。