C# 从本地集合中删除项而不删除
我有以下设置:C# 从本地集合中删除项而不删除,c#,asp.net-core,.net-core,entity-framework-core,C#,Asp.net Core,.net Core,Entity Framework Core,我有以下设置: 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>(); p
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; }
}
在酒吧->
builder.HasKey(k => k.FooId);
builder.Property(p => p.FooId).ValueGenerateNever();
builder.HasMany(hm => hm.Baz).WithOne().HasForeignKey(fk => fk.FooId);
关于Baz->
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中删除。否则,我的单元测试仍然显示它在对象上。问题是,它试图从数据库中硬删除Baz,我不希望这样,但我得到了一个错误:
“实体类型‘Foo’和‘Baz’之间的关联已断开,但关系被标记为‘必需’或隐式必需,因为外键不可为null。如果在断开所需关系时应删除从属/子实体,则将关系设置为使用级联删除。考虑使用“dBraveTopStudioBuffel.EnabasEngsivdEdTracle”来查看键值。
有什么方法可以解决这个问题吗?在理想的情况下,Baz应该只进行软删除,但仍然要从Bar上的Baz集合中删除我认为您将执行硬删除,因为您在调用
方法后调用了Context.Savechange
方法
在RemoveBaz
之后,您的列表已删除Baz
,然后执行SavaChange
,这将执行硬删除
您应该在Savechange
之后编写RemoveBaz
方法
按以下方式更改您的RemoveBaz
:
public void RemoveBaz(Baz baz)
{
_bazes.Remove(baz);
}
然后删除的顺序应该是baz.Delete()
=>SaveChange
=>bar.RemoveBaz(baz)
这是您的问题测试:
这是我的解决方案测试:
就我个人而言,我不想麻烦……但是你可以覆盖SaveChanges/savechangessync并运行pre和post保存方法,将删除变为更新,然后分别从跟踪的更改中删除。您好@jgilladccg,有关于此情况的更新吗?我认为,由于时间限制,我们选择硬删除Baz,这是您ha的唯一原因rd删除是在删除本地集合中的Baz
后执行Savechange
方法,这将导致数据库更新。你读过问题了吗?他已经读过了。如果我的答案对你有用,你可以将其标记为答案,这将帮助将来遇到相同问题的人。
public void RemoveBaz(Baz baz)
{
_bazes.Remove(baz);
}