如何删除具有外键约束的记录?

时间:2012-03-17 17:45:49

标签: c# asp.net asp.net-mvc entity-framework entity-framework-4.1

启动了新的ASP.NET MVC 3应用程序并收到以下错误:

  

无法删除主键值,因为引用了此键   仍然存在。

如何解决这个问题?

模型(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");
}

数据库设置

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

4 个答案:

答案 0 :(得分:18)

找到解决方案:

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

答案 1 :(得分:8)

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

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

enter image description here

在“属性”窗口中,展开 INSERT 更新规范,并将 DeleteRule 属性设置为Cascade。
enter image description here

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

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

在“属性”窗口中,展开 INSERT UPDATE 规范,并将 DeleteRule 属性设置为Cascade。

  

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

获取的解决方案和图片

答案 2 :(得分:1)

在EF Core(3.1.8)中,语法与公认的答案略有不同,但相同的基本思想对我有用,如下所示:

modelBuilder.Entity<Journal>()
            .HasMany(b => b.JournalEntries)
            .WithOne()
            .OnDelete(DeleteBehavior.Cascade);

在查询中选择要从数据库中删除或删除的项目时,要确保同时明确包含这些项目,否则它将继续引发FK错误,如下所示。

var item = _dbContext.Journal.Include(x => x.JournalEntries).SingleOrDefault(x => x.Id == id);

答案 3 :(得分:-3)

我发现了......

转到SQL Server

制作他的数据库图表

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

设置INSERT和更新规范,只需将DELETE RULE设置为CASCADE即可。

请记住Project for This PURPOSE中不需要代码,只需调试并享受它。