如何删除具有外键约束的记录?
启动了一个新的ASP.NET MVC 3应用程序并收到以下错误:
无法删除主键值,因为仍然存在对此键的引用。
怎么解决这个?
型号(EF代码优先)
public class Journal { public int JournalId { get; set; } public string Name { get; set; } public virtual List 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 Journals { get; set; } public DbSet JournalEntries { get; set; } }
找到解决方案:
public class FoodJournalEntities : DbContext { public DbSet Journals { get; set; } public DbSet JournalEntries { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasOptional(j => j.JournalEntries) .WithMany() .WillCascadeOnDelete(true); base.OnModelCreating(modelBuilder); } }
资源
如果从表中删除记录(比如说“blah”),它与其他表(xyz,abc)有其他关系。 默认情况下,如果其他一个表中存在相关行,则数据库将阻止您删除“blah”中的行。
解决方案#1:
您可以先手动删除相关行,这可能需要大量工作。
解决方案#2:
一个简单的解决方案是配置数据库,以便在删除“blah”行时自动删除它们。
按照此打开数据库图表,然后单击关系上的属性
在“属性”窗口中,展开“ INSERT和UPDATE规范”,并将“ DeleteRule”属性设置为“Cascade”。
保存并关闭图表。 如果系统询问您是否要更新数据库,请单击“是”。
要确保模型使内存中的实体与数据库正在执行的操作保持同步,必须在数据模型中设置相应的规则。 打开SchoolModel.edmx,右键单击“blah”和“xyz”之间的关联线,然后选择“属性”。
在“属性”窗口中,展开“ INSERT和UPDATE规范”,并将“ DeleteRule”属性设置为“Cascade”。
解决方案和图像来自http://www.asp.net/web-forms/tutorials/getting-started-with-ef/the-entity-framework-and-aspnet-getting-started-part-2
我找到了…
转到SQL Server
使他的数据库图表化
右键单击父和子之间的关系线,并打开它的属性。
设置INSERT和更新规范,只需将DELETE RULE设置为CASCADE。
请记住Project for This PURPOSE中不需要代码,只需调试并享受它。