C# 如何删除带有外键约束的记录?
启动了新的ASP.NET MVC 3应用程序,并出现以下错误: 无法删除主键值,因为引用了此键 仍然存在 如何解决这个问题 模型EF代码优先 数据库设置C# 如何删除带有外键约束的记录?,c#,asp.net,asp.net-mvc,entity-framework,entity-framework-4.1,C#,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 4.1,启动了新的ASP.NET MVC 3应用程序,并出现以下错误: 无法删除主键值,因为引用了此键 仍然存在 如何解决这个问题 模型EF代码优先 数据库设置 如果从表中删除一条记录,比如blah,它与其他表xyz、abc有其他关系。默认情况下,如果其他某个表中存在相关行,则数据库将阻止您删除blah中的行。 解决方案1: 您可以先手动删除相关行,这可能需要大量工作。 解决方案2: 一个简单的解决方案是将数据库配置为在删除无用行时自动删除它们 按照此操作打开数据库关系图,并单击关系上的属性 在Prop
如果从表中删除一条记录,比如blah,它与其他表xyz、abc有其他关系。默认情况下,如果其他某个表中存在相关行,则数据库将阻止您删除blah中的行。 解决方案1: 您可以先手动删除相关行,这可能需要大量工作。 解决方案2: 一个简单的解决方案是将数据库配置为在删除无用行时自动删除它们 按照此操作打开数据库关系图,并单击关系上的属性 在Properties窗口中,展开INSERT and UPDATE Specification并将DeleteRule属性设置为Cascade。 保存并关闭图表。如果询问您是否要更新数据库,请单击“是” 要确保模型使内存中的实体与数据库正在执行的操作保持同步,必须在数据模型中设置相应的规则。打开SchoolModel.edmx,右键单击blah和xyz之间的关联线,然后选择“属性” 在Properties窗口中,展开INSERT and UPDATE Specification并将DeleteRule属性设置为Cascade 解决方案和从 找到解决方案:
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);
}
}
我找到了
转到SQL Server
把他的数据库做成图表
在父子关系线上单击鼠标右键,打开父子关系线的属性
设置插入和更新规范,只需将删除规则设置为级联
请记住,项目中不需要为此目的编写代码,只需调试并享受它。在EF Core 3.1.8中,语法与公认的答案略有不同,但总体思路相同,对我有效的方法如下:
modelBuilder.Entity<Journal>()
.HasMany(b => b.JournalEntries)
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
在数据库中,您可以为父表选择级联删除选项吗?您的答案可能已经是。如果没有,请发布DbSetup代码。您可以删除该视图。@PankajGarg-我验证了数据库已经有了这个集。@HenkHolterman-好的,我发布了它。这个解决方案看起来适用于EF 4.1之前的版本。DB已经设置好了。哦,太好了,你回答自己:@白ジェームス 你真的13岁了吗?这与Owais Qureshi发布的解决方案相同,但质量较差
public class FoodJournalEntities : DbContext
{
public DbSet<Journal> Journals { get; set; }
public DbSet<JournalEntry> JournalEntries { get; set; }
}
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);
}
}
modelBuilder.Entity<Journal>()
.HasMany(b => b.JournalEntries)
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
var item = _dbContext.Journal.Include(x => x.JournalEntries).SingleOrDefault(x => x.Id == id);