using IRaCIS.Core.Domain.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using System.Reflection;
using EntityFramework.Exceptions.SqlServer;
using IRaCIS.Core.Domain.Share;
using MassTransit;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.ValueGeneration;
using UserTypeGroup = IRaCIS.Core.Domain.Models.UserTypeGroup;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infra.EFCore.Common.Dto;
using Microsoft.Identity.Client;
using EntityFramework.Exceptions.Common;
using System.Data;
using IRaCIS.Core.Infrastructure;
using System.Reflection.Metadata;
namespace IRaCIS.Core.Infra.EFCore
{
///
/// 报错,添加subject 报错,重复添加访视
///
//public class IRaCISDBScopedFactory : IDbContextFactory
//{
// private readonly IDbContextFactory _pooledFactory;
// private readonly IUserInfo _userInfo;
// public IRaCISDBScopedFactory(IDbContextFactory pooledFactory,IUserInfo userInfo)
// {
// _pooledFactory = pooledFactory;
// _userInfo = userInfo;
// }
// public IRaCISDBContext CreateDbContext()
// {
// var context = _pooledFactory.CreateDbContext();
// context._userInfo = _userInfo;
// return context;
// }
//}
public class IRaCISDBContext : DbContext
{
private IUserInfo _userInfo;
private readonly ILogger _logger;
public IRaCISDBContext(DbContextOptions options, IUserInfo userInfo, ILogger logger
) : base(options)
{
_userInfo = userInfo;
_logger = logger;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(builder =>
{
builder.HasBaseType((Type)null);
builder.ToView(null);
builder.HasNoKey();
});
modelBuilder.Entity().HasQueryFilter(p => p.IsAdditional == false);
modelBuilder.Entity().HasMany(t => t.VisitTaskList).WithOne(t => t.DoctorUser).HasForeignKey(t => t.DoctorUserId).IsRequired(false);
//modelBuilder.Entity().HasMany(t => t.DoctorTrialVisitTaskList).WithOne(t => t.DoctorTaskMedicalReviewRule).HasForeignKey(t => new { t.DoctorUserId, t.TrialId }).HasPrincipalKey(u => new { u.DoctorUserId, u.TrialId });
//modelBuilder.Entity().HasMany(t => t.TaskMedicalReviewList).WithOne(t => t.TaskMedicalReviewRule).HasForeignKey(t => new { t.DoctorUserId, t.TrialId }).HasPrincipalKey(u => new { u.DoctorUserId, u.TrialId });
//会导致级联删除
//modelBuilder.Entity().HasMany(t => t.SubjectArmVisitTaskList).WithOne(t => t.SujectArm).HasForeignKey(t => new { t.SubjectId, t.ArmEnum }).HasPrincipalKey(u => new { u.SubjectId, u.ArmEnum })
// ./*IsRequired(false)*/OnDelete(DeleteBehavior.NoAction);
// modelBuilder.Entity().HasOne(t => t.SujectArm).WithMany(s => s.SubjectArmVisitTaskList).HasForeignKey(t => new { t.SubjectId, t.ArmEnum }).HasPrincipalKey(u => new { u.SubjectId, u.ArmEnum });
modelBuilder.Entity().HasMany(t => t.JudgeVisitList).WithOne(t => t.JudgeVisitTask);
modelBuilder.Entity().HasMany(t => t.TaskMedicalReviewList).WithOne(t => t.VisitTask).HasForeignKey(t => t.VisitTaskId);
modelBuilder.Entity().HasOne(t => t.Subject).WithMany(s => s.SubjectVisitTaskList).HasForeignKey(t => t.SubjectId);
modelBuilder.Entity().HasMany(t => t.TaskInfluenceList).WithOne(s => s.OriginalTask).HasForeignKey(t => t.OriginalTaskId);
modelBuilder.Entity().HasMany(t => t.GlobalVisitResultList).WithOne(s => s.GlobalVisitTask).HasForeignKey(t => t.GlobalTaskId);
modelBuilder.Entity().HasMany(t => t.ChildList).WithOne(t => t.Parent);
modelBuilder.Entity().HasMany(t => t.EarlierSubjectUserList).WithOne(t => t.OrignalSubjectUser);
modelBuilder.Entity().HasQueryFilter(b => b.Subject.IsDeleted == false);
//遍历实体模型手动配置
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.ApplyConfiguration(configurationInstance);
}
base.OnModelCreating(modelBuilder);
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
// 软删除配置
if (typeof(ISoftDelete).IsAssignableFrom(entityType.ClrType))
{
entityType.AddSoftDeleteQueryFilter();
}
if (typeof(Entity).IsAssignableFrom(entityType.ClrType))
{
modelBuilder.Entity(entityType.ClrType).Property(nameof(Entity.Id)).HasValueGenerator();
}
}
}
#region
public IQueryable GetTableList()
{
return Set().FromSqlRaw("EXEC dbo.procGetTableList");
}
public IQueryable GetTableColumn(string tableName)
{
return Set().FromSqlRaw($"EXEC dbo.procGetTableColumn {tableName}");
}
#endregion
#region Doctor
public virtual DbSet Dictionary { get; set; }
public virtual DbSet Doctor { get; set; }
public virtual DbSet DoctorCriterionFile { get; set; }
public virtual DbSet DoctorDictionary { get; set; }
public virtual DbSet Postgraduate { get; set; }
public virtual DbSet Education { get; set; }
public virtual DbSet ResearchPublications { get; set; }
public virtual DbSet TrialExperience { get; set; }
public virtual DbSet UserDoctor { get; set; }
public virtual DbSet Vacation { get; set; }
public virtual DbSet Attachment { get; set; }
public virtual DbSet TrialExperienceCriteria { get; set; }
#endregion
#region Enroll
public virtual DbSet DoctorWorkload { get; set; }
public virtual DbSet Enroll { get; set; }
public virtual DbSet EnrollReadingCategory { get; set; }
public virtual DbSet EnrollDetails { get; set; }
#endregion
#region Reading
public virtual DbSet TrialCriterionDictionaryCode { get; set; }
public virtual DbSet ReadingCustomTag { get; set; }
public virtual DbSet SystemCriterionDictionaryCode { get; set; }
public virtual DbSet ReadingTaskRelation { get; set; }
public virtual DbSet OrganInfo { get; set; }
public virtual DbSet ReadingSystemCriterionDictionary { get; set; }
public virtual DbSet ReadingTableAnswerRowInfo { get; set; }
public virtual DbSet OrganTrialInfo { get; set; }
public virtual DbSet ReadingTableQuestionSystem { get; set; }
public virtual DbSet ReadingPeriodSet { get; set; }
public virtual DbSet ReadingTaskQuestionAnswer { get; set; }
public virtual DbSet ReadingPeriodPlan { get; set; }
public virtual DbSet ReadingClinicalData { get; set; }
public virtual DbSet ReadingOncologyTaskInfo { get; set; }
public virtual DbSet ReadingGlobalTaskInfo { get; set; }
public virtual DbSet ReadingQuestionCriterionSystem { get; set; }
public virtual DbSet ReadingQuestionCriterionTrial { get; set; }
public virtual DbSet ReadingQuestionSystem { get; set; }
public virtual DbSet ReadingQuestionTrial { get; set; }
//public virtual DbSet ReadingClinicalDataView { get; set; }
public virtual DbSet ReadingClinicalDataPDF { get; set; }
public virtual DbSet ReadingConsistentClinicalData { get; set; }
public virtual DbSet ReadingConsistentClinicalDataPDF { get; set; }
public virtual DbSet ReadingJudgeInfo { get; set; }
public virtual DbSet ReadModule { get; set; }
public virtual DbSet ReadModuleView { get; set; }
public virtual DbSet ClinicalDataTrialSet { get; set; }
public virtual DbSet ClinicalDataSystemSet { get; set; }
public virtual DbSet ReadingMedicineSystemQuestion { get; set; }
public virtual DbSet ReadingMedicineTrialQuestion { get; set; }
public virtual DbSet ReadingMedicineQuestionAnswer { get; set; }
public virtual DbSet ReadingMedicalReviewDialog { get; set; }
public virtual DbSet CriterionNidusSystem { get; set; }
public virtual DbSet CriterionNidusTrial { get; set; }
public virtual DbSet ReadingTrialCriterionDictionary { get; set; }
public virtual DbSet ReadingTableQuestionTrial { get; set; }
public virtual DbSet TumorAssessment_RECIST1Point1BM { get; set; }
public virtual DbSet TumorAssessment_RECIST1Point1 { get; set; }
public virtual DbSet TumorAssessment_IRECIST1Point1 { get; set; }
public virtual DbSet TrialClinicalDataSetCriterion { get; set; }
public virtual DbSet TrialCriterionAdditionalAssessmentType { get; set; }
public virtual DbSet SubjectCriteriaEvaluation { get; set; }
public virtual DbSet SubjectAdditionalEvaluationResult { get; set; }
public virtual DbSet SubjectCriteriaEvaluationVisitFilter { get; set; }
public virtual DbSet SubjectCriteriaEvaluationVisitStudyFilter { get; set; }
public virtual DbSet ReadingTaskQuestionMark { get; set; }
//public virtual DbSet TrialClinicalDataCriterion { get; set; }
//public virtual DbSet SystemClinicalDataCriterion { get; set; }
#endregion
#region Subject and Visit and study
public virtual DbSet StudyMonitor { get; set; }
public virtual DbSet Subject { get; set; }
public virtual DbSet VisitPlans { get; set; }
public virtual DbSet VisitPlanInfluenceStudy { get; set; }
public virtual DbSet VisitPlanInfluenceStat { get; set; }
public virtual DbSet NoneDicomStudyFile { get; set; }
public virtual DbSet NoneDicomStudy { get; set; }
public virtual DbSet PreviousPDF { get; set; }
public virtual DbSet PreviousSurgery { get; set; }
public virtual DbSet PreviousOther { get; set; }
public virtual DbSet PreviousHistory { get; set; }
public virtual DbSet DicomStudys { get; set; }
public virtual DbSet DicomSeries { get; set; }
public virtual DbSet DicomInstances { get; set; }
public virtual DbSet ImageShare { get; set; }
#endregion
#region Management
public virtual DbSet VerificationCodes { get; set; }
public virtual DbSet