[英]EntityFramework OwnedType with Soft-delete
我的实体上的自有类型存在问题,因为我为 SaveChanges 添加了覆盖以使软删除成为可能。 基本上,我在 SaveChanges 中覆盖实体的 state 以修改而不是删除,并向实体添加一些元信息。 除非我将 OwnedType 添加到实体上,否则这很有效。
当我这样做时,EF 会尝试将 OwnedType 中的所有值设置为 NULL,这在我的示例中是不可能的,因为字符串不可为空。
我不确定如何解决此问题,因为我需要将 DeleteBehaviour 设置为 NoAction,但目前我找不到执行此操作的方法。 谁能向我解释如何解决这个问题?
MainEntity.cs
public class MainEntity: SoftDeleteEntityBase
{
public int Id { get; set; }
public LocalizedStringSet MultilangTitle { get; set; } = new LocalizedStringSet();
}
本地化字符串集.cs
public class LocalizedStringSet
{
[MaxLength(4000)]
public string En { get; set; } = string.Empty;
[MaxLength(4000)]
public string Fr { get; set; } = string.Empty;
}
MainEntityConfiguration.cs
public class MainEntityConfiguration : IEntityTypeConfiguration<MainEntity>
{
public void Configure(EntityTypeBuilder<MainEntity> builder)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).ValueGeneratedOnAdd();
builder.OwnsOne(o => o.MultilangTitle);
}
}
ApplicationDbContext.cs
public override int SaveChanges()
{
if (entry.Entity is ISoftDeleteEntityBase managedCreationSoftDelete)
{
switch (entry.State)
{
case EntityState.Deleted:
{
entry.State = EntityState.Modified;
managedCreationSoftDelete.DeletedBy = creator;
managedCreationSoftDelete.Deleted = DateTime.Now;
break;
}
}
}
return base.SaveChanges();
}
我找到了解决它的方法,但我不确定是否有更好的方法来做到这一点。
public override int SaveChanges()
{
if (entry.Entity is ISoftDeleteEntityBase managedCreationSoftDelete)
{
switch (entry.State)
{
case EntityState.Deleted:
{
entry.State = EntityState.Modified;
managedCreationSoftDelete.DeletedBy = creator;
managedCreationSoftDelete.Deleted = DateTime.Now;
foreach (var reference in entry.References)
{
if (reference.TargetEntry?.Entity.GetType() == typeof(LocalizedStringSet))
{
if (reference.TargetEntry != null)
{
reference.TargetEntry.State = EntityState.Unchanged;
}
}
}
break;
}
}
}
return base.SaveChanges();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.