Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 软删除我的实体的子对象 我有一个样品和样品。 我从sample中的sampleItems列表中删除了一个sampleItem。 我保存DBContext。_C#_Entity Framework Core - Fatal编程技术网

C# 软删除我的实体的子对象 我有一个样品和样品。 我从sample中的sampleItems列表中删除了一个sampleItem。 我保存DBContext。

C# 软删除我的实体的子对象 我有一个样品和样品。 我从sample中的sampleItems列表中删除了一个sampleItem。 我保存DBContext。,c#,entity-framework-core,C#,Entity Framework Core,我想删除sampleItem 我的代码: public class Entity: { public Guid Id { get; set; } public bool IsDeleted { get; set; } } public class Sample : Entity{ public string Text { get; set; } public List<SampleItem> SampleItems {

我想删除sampleItem

我的代码:

public class Entity: {
        public Guid Id { get; set; }
        public bool IsDeleted { get; set; }
}

public class Sample : Entity{
        public string Text { get; set; }
        public List<SampleItem> SampleItems { get; set; } = new List<SampleItem>();
}

public class SampleItem :Entity{
        public string Text { get; set; }
        public virtual Sample Sample { get; set; }
}
在MyDbContext中,我有:

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
    foreach (var entry in ChangeTracker.Entries())
    {
        switch (entry.State)
        {
            case EntityState.Added:
                //Do stuff
                break;

            case EntityState.Modified:
                //Do stuff
                break;

            case EntityState.Deleted:
                if (entry.Entity is Entity entity)
                {
                    entry.State = EntityState.Unchanged;
                    entity.IsDeleted = true;
                }
                break;
        }
    }

    return base.SaveChangesAsync(cancellationToken);
}
现在,我在执行SaveChanges时出错:

public bool IsSoftDelete { get; set; }

public override int SaveChanges()
{
   ...
// Modified State
                var modified = this.ChangeTracker.Entries()
                            .Where(t => t.State == EntityState.Modified)
                            .Select(t => t.Entity)
                            .ToArray();

                foreach (var entity in modified)
                {
                    if (entity is ITrack)
                    {
                        var track = entity as ITrack;
                        Entry(track).Property(x => x.CreatedDate).IsModified = false;
                        Entry(track).Property(x => x.CreatedBy).IsModified = false;
                        track.ModifiedDate = DateTime.UtcNow;
                        track.ModifiedBy = UserId;

                        if (IsSoftDelete)
                        {
                            track.IsDeleted = true;
                            track.DeletedDate = DateTime.UtcNow;
                            track.DeletedBy = UserId;
                        }
                    }
                }
实体“Sample”和“SampleItem”与 键值“{Id:1c41c336-b75b-4f6b-6057-08d5f3d981ae}”已被删除 已断开,但关系标记为“必需”或 隐式必需,因为外键不可为null。如果 当需要关系时,应删除从属/子实体 断开,然后设置关系以使用级联删除

有关级联配置的更多详细信息:

这是正常的。现在我需要找到禁用SampleItem的删除并启用SoftDelete


您有什么想法吗?

您可能已经解决了这个问题,但是删除sample.SampleItems.RemoveAtindex;并替换为:

// Do the soft delete
db.IsSoftDelete = true;
db.Entry(activity).State = EntityState.Modified;

db.UserId = userId;
await db.SaveChangesAsync();
然后在覆盖保存更改时:

public bool IsSoftDelete { get; set; }

public override int SaveChanges()
{
   ...
// Modified State
                var modified = this.ChangeTracker.Entries()
                            .Where(t => t.State == EntityState.Modified)
                            .Select(t => t.Entity)
                            .ToArray();

                foreach (var entity in modified)
                {
                    if (entity is ITrack)
                    {
                        var track = entity as ITrack;
                        Entry(track).Property(x => x.CreatedDate).IsModified = false;
                        Entry(track).Property(x => x.CreatedBy).IsModified = false;
                        track.ModifiedDate = DateTime.UtcNow;
                        track.ModifiedBy = UserId;

                        if (IsSoftDelete)
                        {
                            track.IsDeleted = true;
                            track.DeletedDate = DateTime.UtcNow;
                            track.DeletedBy = UserId;
                        }
                    }
                }

我会从一开始就将软删除作为常规更新处理。毕竟,这是一个更新。对象图中的实体状态是相互关联的。你不想篡改它们。我从来都不理解这些将删除重定向到更新的巧妙解决方案。这将永远是一个预期会产生不可预测的副作用的领域。有一天,entity framework团队将默认启用我希望的软删除;。但目前,是的,狡猾的解决方案是一种方法。我从未找到解决方案。。。目前,我真的很忙,但我会尝试你的解决方案,如果我可以我希望很快。感谢您的帮助:
// Do the soft delete
db.IsSoftDelete = true;
db.Entry(activity).State = EntityState.Modified;

db.UserId = userId;
await db.SaveChangesAsync();
public bool IsSoftDelete { get; set; }

public override int SaveChanges()
{
   ...
// Modified State
                var modified = this.ChangeTracker.Entries()
                            .Where(t => t.State == EntityState.Modified)
                            .Select(t => t.Entity)
                            .ToArray();

                foreach (var entity in modified)
                {
                    if (entity is ITrack)
                    {
                        var track = entity as ITrack;
                        Entry(track).Property(x => x.CreatedDate).IsModified = false;
                        Entry(track).Property(x => x.CreatedBy).IsModified = false;
                        track.ModifiedDate = DateTime.UtcNow;
                        track.ModifiedBy = UserId;

                        if (IsSoftDelete)
                        {
                            track.IsDeleted = true;
                            track.DeletedDate = DateTime.UtcNow;
                            track.DeletedBy = UserId;
                        }
                    }
                }