diff --git a/IRaCIS.Core.Domain/Trial/TrialStatusDetail.cs b/IRaCIS.Core.Domain/Trial/TrialStatusDetail.cs index 4baa2b531..740c60fa6 100644 --- a/IRaCIS.Core.Domain/Trial/TrialStatusDetail.cs +++ b/IRaCIS.Core.Domain/Trial/TrialStatusDetail.cs @@ -5,9 +5,6 @@ namespace IRaCIS.Core.Domain.Models; public partial class TrialStatusDetail : BaseAddAuditEntity { #region - [JsonIgnore] - public List IntoGroupDetails { get; set; } - [JsonIgnore] public Trial Trial { get; set; } #endregion diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index 9778e7371..47c95e1da 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -3,6 +3,7 @@ using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infrastructure.Encryption; using IRaCIS.Core.Infrastructure.Extention; +using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Newtonsoft.Json; using System.ComponentModel; @@ -77,11 +78,11 @@ public class IRaCISDBContext : DbContext }); modelBuilder.Entity(entity => - { + { //项目术语配置 entity.OwnsMany(x => x.TrialObjectNameList, ownedNavigationBuilder => { - ownedNavigationBuilder.ToJson() ; + ownedNavigationBuilder.ToJson(); }); }); @@ -144,13 +145,54 @@ public class IRaCISDBContext : DbContext base.OnModelCreating(modelBuilder); + //软删除筛选器通常依赖于实体模型的完整定义(例如属性映射、继承关系等) + + + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { // 软删除配置 if (typeof(ISoftDelete).IsAssignableFrom(entityType.ClrType)) { - entityType.AddSoftDeleteQueryFilter(); + //entityType.AddSoftDeleteQueryFilter(); + // 动态创建表达式:e => e.IsDeleted==false + var parameter = Expression.Parameter(entityType.ClrType, "e"); + var property = Expression.Property(parameter, nameof(ISoftDelete.IsDeleted)); + var filter = Expression.Lambda( + Expression.Equal(property, Expression.Constant(false)), + parameter); + + // 应用全局查询筛选器 + modelBuilder.Entity(entityType.ClrType).HasQueryFilter(filter); + + //Console.WriteLine($"实体应用软删除:{entityType.ClrType.Name}"); + + } + foreach (var navigation in entityType.GetNavigations()) + { + + if (navigation.IsCollection) continue; + + // 配置基于导航属性的软删除查询筛选器 + if (typeof(ISoftDelete).IsAssignableFrom(navigation.TargetEntityType.ClrType)) + { + var clrType = entityType.ClrType; + var targetType = navigation.TargetEntityType.ClrType; + + //e => e.Subject.IsDeleted==false + var parameterNav = Expression.Parameter(clrType, "e"); + var navigationProperty = Expression.Property(parameterNav, navigation.Name); + var navigationFilter = Expression.Equal( + Expression.Property(navigationProperty, nameof(ISoftDelete.IsDeleted)), + Expression.Constant(false)); + + var filterNav = Expression.Lambda(navigationFilter, parameterNav); + + modelBuilder.Entity(clrType).HasQueryFilter(filterNav); + + //Console.WriteLine($"实体应用软删除:{entityType.ClrType.Name} 导航属性{filterNav}"); + } } if (typeof(Entity).IsAssignableFrom(entityType.ClrType)) @@ -588,7 +630,7 @@ public class TestLength : Entity public string Name { get; set; } [StringLength(1000)] - public string[] StringList { get; set; }=new string[] { }; + public string[] StringList { get; set; } = new string[] { }; public List DateTimeList { get; set; } = new List(); diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/VisitTaskConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/VisitTaskConfigration.cs index c592a9fbb..c3d486497 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/VisitTaskConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/VisitTaskConfigration.cs @@ -21,7 +21,7 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration //对于全局修改的任务而言,会关联多个全局访视阅片结果(因为同一个访视结果,会被多个全局修改) //subject 删除了,但是任务没删除,导致的查询问题 - builder.HasQueryFilter(b => b.Subject.IsDeleted == false); + //builder.HasQueryFilter(b => b.Subject.IsDeleted == false); } }