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);
    }