gpt4 book ai didi

entity-framework-5 - Entity Framework 5、删除一对多关系?

转载 作者:行者123 更新时间:2023-12-04 14:46:17 25 4
gpt4 key购买 nike

实体A,B的关系是一对多的,(A有很多B,B一定属于A)。

我已禁用 lazy loading并像这样加载A,B:

dbContext.As.Load();
//**particaly load B**
dbContext.Bs.Where(predicateX).Load();

当我使用

dbContext.As.Remove(someA)

删除A,遇到如下错误提示
The relationship could not be changed because one or more of the foreign-key properties is non-nullable
相反,如果我使用:

//remove all B in someA
foreach(B b in someA.Bs.ToList())
{
dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA)

一切都好。

有一个更好的方法吗?

编辑

我正在使用 Database First 并在数据库端添加 B 的外键约束(在删除级联上)。

我认为“外键约束”就等于代码“OnModelCreating”。但是代码“dbContext.As.Remove(someA)”没有按预期工作。

当有 A-B-C 级联一对多关系时,事情会变得更糟。为了删除 someA,你需要这样做
foreach(B b in someA.Bs.ToList())
{
foreach(C c in b.Cs.ToList())
{
dbContext.Cs.Remove(c);
}
dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA);

已解决:

我首先使用数据库(sqlite)并在数据库端添加外键约束。

使用 vs2012 从 sqlite 数据库文件创建 edmx,

vs2012 未能设置关系的“删除级联”属性。

手动设置属性后,对“dbContext.As.Remove(someA)”的单次调用按预期工作!

最佳答案

遗憾的是, Entity Framework 中(目前)没有批处理支持,所以您被困 foreach - 通过多个属性。您可能想查看 EntityFramework.Extended项目,它添加了各种批处理操作来整理这样的代码(以及提高性能)。

如果您确定在删除 A 时总是希望删除相关的 B,则将此关系配置为使用“删除级联”行为。这意味着当父 A 被删除时,它的所有子 B 也会被自动删除。如何做到这一点取决于您如何创建数据库。如果您使用的是 Code First,它将是这样的:

public class MyContext : DbContext
{
public DbSet<A> As { get; set; }
public DbSet<B> Bs { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<A>()
.HasMany(a => a.Bs)
.WithRequired(b => b.A)
.WillCascadeOnDelete();
}
}

关于entity-framework-5 - Entity Framework 5、删除一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18122647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com