c# - 从本地集合中删除项目而不删除
问题描述
我有以下设置:
public class Foo
{
public int FooId { get; private set; }
}
public class Bar
{
public int FooId { get; private set; }
public Foo Foo { get; private set; }
private readonly List<Baz> _bazes= new List<Baz>();
public IReadOnlyCollection<Baz> Bazes => _bazes.AsReadOnly();
public Baz AddBaz(Baz baz)
{
_bazes.Add(baz);
}
public void RemoveBaz(Baz baz)
{
baz.Delete();
_bazes.Remove(baz);
}
}
public class Baz
{
public int BazId { get; private set; }
public int FooId { get; private set; }
public Foo Foo { get; private set; }
public int QuxId { get; private set; }
public Qux Qux { get; private set; }
public DateTime? DateDeleted { get; private set; }
public void Delete()
{
DateDelete = DateTime.UtcNow;
}
}
public class Qux
{
public int QuxId { get; private set; }
}
这都是通过 EF Core 管理的:
安富->
builder.HasKey(k => k.FooId);
builder.Property(p => p.FooId).ValueGeneratedOnAdd();
在酒吧 ->
builder.HasKey(k => k.FooId);
builder.Property(p => p.FooId).ValueGenerateNever();
builder.HasMany(hm => hm.Baz).WithOne().HasForeignKey(fk => fk.FooId);
在巴兹 ->
builder.HasQueryFilter(qf => !qf.DateDeleted.HasValue);
builder.HasKey(k => k.BazId);
builder.Property(p => p.BazId).ValueGeneratedOnAdd();
builder.HasOne(ho => ho.FooId).WithMany().HasForeignKey(fk => fk.FooId);
builder.HasOne(ho => ho.QuxId).WithMany().HasForeignKey(fk => fk.QuxId);
在 Qux ->
builder.HasKey(k => k.QuxId);
builder.Property(p => p.QuxId).ValueGenerateOnAdd();
除了尝试删除 Baz 时,所有这些都完全按预期工作。因为我只想软删除,所以我调用 Baz.Delete(),但我还需要将它从 Bar._bazes 中删除,否则我的单元测试仍然显示它在对象上。这样做的问题是它试图从数据库中硬删除 Baz,这是我不想要的,我收到了一个错误:
“实体类型 'Foo' 和 'Baz' 之间的关联已被切断,但该关系要么被标记为‘必需’,要么是隐式必需的,因为外键不可为空。如果在需要时应删除依赖/子实体关系被切断,然后设置关系以使用级联删除。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看键值。”
有没有办法解决这个问题?在理想情况下,Baz 应该只软删除,但仍应从 Bar 上的 baze 集合中删除
解决方案
推荐阅读
- azure - Azure API 管理 - 当 APM 落后于 WAF 时如何获取原始 IP
- wpf - 上下文菜单项未触发 Click 事件
- java - 回收视图不显示来自适配器的数据
- ios - 替换对象数组中的特定值 swift 5
- regex - 如何使用 ansible regexp 将新字符串插入到 telegraf.conf 的 inputs.ping
- android - 某些图标未在某些 android 设备中显示
- javascript - 谷歌在不透明层上方映射标记 Z-index
- excel-formula - 移动后重新编号行
- pyspark - 如何在 PySpark 中从 SparkContext 创建 SparkSession?
- ios - iOS Cordova Safari - 键盘使浮动按钮消失