C# 软删除我的实体的子对象 我有一个样品和样品。 我从sample中的sampleItems列表中删除了一个sampleItem。 我保存DBContext。
我想删除sampleItem 我的代码: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 {
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;
}
}
}