irc-netcore-api/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs

632 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure.Encryption;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Newtonsoft.Json;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
namespace IRaCIS.Core.Infra.EFCore;
#region 连接池废弃
/// <summary>
/// 报错添加subject 报错,重复添加访视
/// </summary>
//public class IRaCISDBScopedFactory : IDbContextFactory<IRaCISDBContext>
//{
// private readonly IDbContextFactory<IRaCISDBContext> _pooledFactory;
// private readonly IUserInfo _userInfo;
// public IRaCISDBScopedFactory(IDbContextFactory<IRaCISDBContext> pooledFactory,IUserInfo userInfo)
// {
// _pooledFactory = pooledFactory;
// _userInfo = userInfo;
// }
// public IRaCISDBContext CreateDbContext()
// {
// var context = _pooledFactory.CreateDbContext();
// context._userInfo = _userInfo;
// return context;
// }
//}
#endregion
public class IRaCISDBContext : DbContext
{
public IRaCISDBContext(DbContextOptions<IRaCISDBContext> options) : base(options)
{
}
/// <summary>
/// efcore codefirst 防止数据注解过多配置,全局统一配置
/// </summary>
/// <param name="configurationBuilder"></param>
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
//decimal 不配置默认精度是18,2
//configurationBuilder.Conventions.Add(_ => new DecimalPrecisionConvention(18,2));
//针对字符串使用默认的长度配置为200如果标注了StringLength 其他长度就是标注的长度如果标注了MaxLength 那么就是nvarcharMax
configurationBuilder.Conventions.Add(_ => new DefaultStringLengthConvention(400));
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TestLength>(entity =>
{
// 使用部分加密值转换器,前 2 个字符不加密,方便模糊搜索
entity.Property(e => e.Name).HasConversion(new PartialEncryptionConverter(2));
//entity.OwnsMany(x => x.TestJsonObjectLsit, ownedNavigationBuilder =>
//{
// ownedNavigationBuilder.ToJson();
//});
entity.Property(e => e.TestJsonObjectLsit).HasConversion(v => v == null ? "[]" : JsonConvert.SerializeObject(v),
v => string.IsNullOrEmpty(v) ? null : JsonConvert.DeserializeObject<List<TestJsonObject>>(v));
});
modelBuilder.Entity<Trial>(entity =>
{
//项目术语配置
entity.OwnsMany(x => x.TrialObjectNameList, ownedNavigationBuilder =>
{
ownedNavigationBuilder.ToJson() ;
});
});
#region pgsql codefirst 配置 暂时屏蔽
//if (base.Database.IsNpgsql())
//{
// modelBuilder.HasPostgresExtension("uuid-ossp");
// //保证pgsql 生成的时间默认为timestamp 而不是 timestamp with time zone
// foreach (var entityType in modelBuilder.Model.GetEntityTypes())
// {
// foreach (var property in entityType.GetProperties())
// {
// if (property.ClrType == typeof(DateTime) || property.ClrType == typeof(DateTime?))
// {
// property.SetColumnType("timestamp without time zone");
// }
// }
// }
//}
#endregion
#region decimal 自定义精度,适配多种数据库
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
// 如果属性类型是 decimal 或 nullable decimal
if (property.ClrType == typeof(decimal) || property.ClrType == typeof(decimal?))
{
// 获取自定义的 DecimalPrecisionAttribute
var precisionAttr = property.PropertyInfo?.GetCustomAttributes(typeof(DecimalPrecisionAttribute), false)
.FirstOrDefault() as DecimalPrecisionAttribute;
if (precisionAttr != null)
{
property.SetPrecision(precisionAttr.Precision);
property.SetScale(precisionAttr.Scale);
}
else
{
// 默认的精度设置
property.SetPrecision(18);
property.SetScale(2);
}
}
}
}
#endregion
//遍历实体模型手动配置
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<Guid>(nameof(Entity.Id)).HasValueGenerator<MySequentialGuidValueGenerator>();
}
if (typeof(IEntitySeqId).IsAssignableFrom(entityType.ClrType))
{
modelBuilder.Entity(entityType.ClrType).Property<Guid>(nameof(IEntitySeqId.SeqId)).HasValueGenerator<MySequentialGuidValueGenerator>();
}
}
}
#region 获取表名 和字段名 优化
/// <summary>
/// 直接获取代码定义的模型以及表上定义的Description 获取表信息 以及备注
/// </summary>
/// <returns></returns>
public List<TableList> GetContextTablesList()
{
var tableList = new List<TableList>();
foreach (var entityType in this.Model.GetEntityTypes())
{
var clrType = entityType.ClrType;
var tableName = entityType.GetTableName();
var tableDescription = clrType.GetCustomAttribute<DescriptionAttribute>()?.Description ?? string.Empty;
tableList.Add(new TableList
{
Name = tableName,
Remake = tableDescription,
});
}
return tableList;
}
/// <summary>
/// 直接获取代码定义的某个表的属性以及属性上定义的Description 获取备注
/// </summary>
/// <returns></returns>
public List<TableList> GetContextTableColumnList(string tableName)
{
var tableColumList = new List<TableList>();
var entityType = this.Model.GetEntityTypes().FirstOrDefault(t => t.GetTableName().ToLower() == tableName.ToLower());
if (entityType == null)
{
throw new ArgumentException($"Table '{tableName}' not found.");
}
var clrType = entityType.ClrType;
foreach (var property in entityType.GetProperties())
{
var columnName = property.GetColumnName();
var columnDescription = clrType.GetProperty(property.Name)?.GetCustomAttribute<DescriptionAttribute>()?.Description ?? string.Empty;
tableColumList.Add(new TableList
{
Name = columnName,
Remake = columnDescription,
});
}
return tableColumList.OrderBy(t => t.Name).ToList();
}
#endregion
#region Doctor
public virtual DbSet<Dictionary> Dictionary { get; set; }
public virtual DbSet<Doctor> Doctor { get; set; }
public virtual DbSet<DoctorCriterionFile> DoctorCriterionFile { get; set; }
public virtual DbSet<DoctorDictionary> DoctorDictionary { get; set; }
public virtual DbSet<Postgraduate> Postgraduate { get; set; }
public virtual DbSet<Education> Education { get; set; }
public virtual DbSet<ResearchPublication> ResearchPublications { get; set; }
public virtual DbSet<TrialExperience> TrialExperience { get; set; }
public virtual DbSet<Vacation> Vacation { get; set; }
public virtual DbSet<Attachment> Attachment { get; set; }
public virtual DbSet<TrialExperienceCriteria> TrialExperienceCriteria { get; set; }
#endregion
#region Enroll
public virtual DbSet<Workload> DoctorWorkload { get; set; }
public virtual DbSet<Enroll> Enroll { get; set; }
public virtual DbSet<EnrollReadingCategory> EnrollReadingCategory { get; set; }
public virtual DbSet<EnrollDetail> EnrollDetails { get; set; }
#endregion
#region Reading
public virtual DbSet<TrialCriterionDictionaryCode> TrialCriterionDictionaryCode { get; set; }
public virtual DbSet<ReadingCustomTag> ReadingCustomTag { get; set; }
public virtual DbSet<SystemCriterionDictionaryCode> SystemCriterionDictionaryCode { get; set; }
public virtual DbSet<ReadingTaskRelation> ReadingTaskRelation { get; set; }
public virtual DbSet<OrganInfo> OrganInfo { get; set; }
public virtual DbSet<ReadingSystemCriterionDictionary> ReadingSystemCriterionDictionary { get; set; }
public virtual DbSet<ReadingTableAnswerRowInfo> ReadingTableAnswerRowInfo { get; set; }
public virtual DbSet<OrganTrialInfo> OrganTrialInfo { get; set; }
public virtual DbSet<ReadingTableQuestionSystem> ReadingTableQuestionSystem { get; set; }
public virtual DbSet<ReadingPeriodSet> ReadingPeriodSet { get; set; }
public virtual DbSet<ReadingTaskQuestionAnswer> ReadingTaskQuestionAnswer { get; set; }
public virtual DbSet<ReadingPeriodPlan> ReadingPeriodPlan { get; set; }
public virtual DbSet<ReadingClinicalData> ReadingClinicalData { get; set; }
public virtual DbSet<ReadingOncologyTaskInfo> ReadingOncologyTaskInfo { get; set; }
public virtual DbSet<ReadingGlobalTaskInfo> ReadingGlobalTaskInfo { get; set; }
public virtual DbSet<ReadingQuestionCriterionSystem> ReadingQuestionCriterionSystem { get; set; }
public virtual DbSet<ReadingQuestionCriterionTrial> ReadingQuestionCriterionTrial { get; set; }
public virtual DbSet<ReadingQuestionSystem> ReadingQuestionSystem { get; set; }
public virtual DbSet<ReadingQuestionTrial> ReadingQuestionTrial { get; set; }
public virtual DbSet<ReadingClinicalDataPDF> ReadingClinicalDataPDF { get; set; }
public virtual DbSet<ReadingConsistentClinicalData> ReadingConsistentClinicalData { get; set; }
public virtual DbSet<ReadingConsistentClinicalDataPDF> ReadingConsistentClinicalDataPDF { get; set; }
public virtual DbSet<ReadingJudgeInfo> ReadingJudgeInfo { get; set; }
public virtual DbSet<ReadModule> ReadModule { get; set; }
public virtual DbSet<ClinicalDataTrialSet> ClinicalDataTrialSet { get; set; }
public virtual DbSet<ClinicalDataSystemSet> ClinicalDataSystemSet { get; set; }
public virtual DbSet<ReadingMedicineSystemQuestion> ReadingMedicineSystemQuestion { get; set; }
public virtual DbSet<ReadingMedicineTrialQuestion> ReadingMedicineTrialQuestion { get; set; }
public virtual DbSet<ReadingMedicineQuestionAnswer> ReadingMedicineQuestionAnswer { get; set; }
public virtual DbSet<ReadingMedicalReviewDialog> ReadingMedicalReviewDialog { get; set; }
public virtual DbSet<CriterionNidusSystem> CriterionNidusSystem { get; set; }
public virtual DbSet<CriterionNidusTrial> CriterionNidusTrial { get; set; }
public virtual DbSet<ReadingTrialCriterionDictionary> ReadingTrialCriterionDictionary { get; set; }
public virtual DbSet<ReadingTableQuestionTrial> ReadingTableQuestionTrial { get; set; }
public virtual DbSet<TumorAssessment_RECIST1Point1BM> TumorAssessment_RECIST1Point1BM { get; set; }
public virtual DbSet<TumorAssessment_RECIST1Point1> TumorAssessment_RECIST1Point1 { get; set; }
public virtual DbSet<TumorAssessment_IRECIST1Point1> TumorAssessment_IRECIST1Point1 { get; set; }
public virtual DbSet<TrialClinicalDataSetCriterion> TrialClinicalDataSetCriterion { get; set; }
public virtual DbSet<TrialCriterionAdditionalAssessmentType> TrialCriterionAdditionalAssessmentType { get; set; }
public virtual DbSet<SubjectCriteriaEvaluation> SubjectCriteriaEvaluation { get; set; }
public virtual DbSet<SubjectAdditionalEvaluationResult> SubjectAdditionalEvaluationResult { get; set; }
public virtual DbSet<SubjectCriteriaEvaluationVisitFilter> SubjectCriteriaEvaluationVisitFilter { get; set; }
public virtual DbSet<SubjectCriteriaEvaluationVisitStudyFilter> SubjectCriteriaEvaluationVisitStudyFilter { get; set; }
public virtual DbSet<ReadingTaskQuestionMark> ReadingTaskQuestionMark { get; set; }
//public virtual DbSet<TrialClinicalDataCriterion> TrialClinicalDataCriterion { get; set; }
//public virtual DbSet<SystemClinicalDataCriterion> SystemClinicalDataCriterion { get; set; }
#endregion
#region Subject and Visit and study
public virtual DbSet<StudyMonitor> StudyMonitor { get; set; }
public virtual DbSet<Subject> Subject { get; set; }
public virtual DbSet<VisitStage> VisitPlans { get; set; }
public virtual DbSet<VisitPlanInfluenceStudy> VisitPlanInfluenceStudy { get; set; }
public virtual DbSet<VisitPlanInfluenceStat> VisitPlanInfluenceStat { get; set; }
public virtual DbSet<NoneDicomStudyFile> NoneDicomStudyFile { get; set; }
public virtual DbSet<NoneDicomStudy> NoneDicomStudy { get; set; }
public virtual DbSet<PreviousPDF> PreviousPDF { get; set; }
public virtual DbSet<PreviousSurgery> PreviousSurgery { get; set; }
public virtual DbSet<PreviousOther> PreviousOther { get; set; }
public virtual DbSet<PreviousHistory> PreviousHistory { get; set; }
public virtual DbSet<DicomStudy> DicomStudys { get; set; }
public virtual DbSet<DicomSeries> DicomSeries { get; set; }
public virtual DbSet<DicomInstance> DicomInstances { get; set; }
public virtual DbSet<ImageShare> ImageShare { get; set; }
#endregion
#region Management
public virtual DbSet<VerificationCode> VerificationCodes { get; set; }
public virtual DbSet<Menu> MenuFunctions { get; set; }
public virtual DbSet<UserTypeMenu> UserTypeMenuFunction { get; set; }
public virtual DbSet<User> Users { get; set; }
public virtual DbSet<UserType> UserType { get; set; }
#endregion
#region Institution
public virtual DbSet<Hospital> Hospitals { get; set; }
public virtual DbSet<CRO> CROCompany { get; set; }
public virtual DbSet<Sponsor> Sponsor { get; set; }
#endregion
#region Trial
public virtual DbSet<Trial> Trial { get; set; }
public virtual DbSet<TrialDictionary> TrialDictionary { get; set; }
public virtual DbSet<TrialStatusDetail> TrialDetail { get; set; }
public virtual DbSet<TrialUser> UserTrial { get; set; }
public virtual DbSet<TrialDictionary> ProjectDictionary { get; set; }
public virtual DbSet<TrialSiteUser> UserTrialSite { get; set; }
public virtual DbSet<TrialSite> TrialSite { get; set; }
public virtual DbSet<Site> Site { get; set; }
public virtual DbSet<User> User { get; set; }
public virtual DbSet<UserPassWordLog> UserPassWordLog { get; set; }
public virtual DbSet<TrialSiteUserSurvey> TrialSiteUserSurvey { get; set; }
public virtual DbSet<TrialSiteEquipmentSurvey> TrialSiteEquipmentSurvey { get; set; }
public virtual DbSet<TrialSiteSurvey> TrialSiteSurvey { get; set; }
#endregion
#region Financial
public virtual DbSet<ReviewerPayInformation> ReviewerPayInformation { get; set; }
public virtual DbSet<RankPrice> RankPrice { get; set; }
public virtual DbSet<TrialPaymentPrice> TrialPaymentPrice { get; set; }
public virtual DbSet<VolumeReward> AwardPrice { get; set; }
public virtual DbSet<Payment> Payment { get; set; }
public virtual DbSet<PaymentDetail> PaymentDetail { get; set; }
public virtual DbSet<ExchangeRate> ExchangeRate { get; set; }
public virtual DbSet<TrialRevenuesPrice> TrialRevenuesPrice { get; set; }
public virtual DbSet<PaymentAdjustment> PaymentAdjustment { get; set; }
public virtual DbSet<TrialRevenuesPriceVerification> TrialRevenuesPriceVerification { get; set; }
#endregion
#region QC
public virtual DbSet<TrialQCQuestion> TrialQCQuestionConfigure { get; set; }
public virtual DbSet<QCQuestion> QCQuestionConfigure { get; set; }
public virtual DbSet<TrialQCQuestionAnswer> TrialQCQuestionAnswer { get; set; }
public virtual DbSet<CheckChallengeDialog> CheckChallengeDialog { get; set; }
#endregion
#region QA
public virtual DbSet<QCChallengeDialog> QCChallengeDialog { get; set; }
//public virtual DbSet<QANotice> QATemplateDictionary { get; set; }
public virtual DbSet<QCChallenge> QCChallenge { get; set; }
public virtual DbSet<SubjectVisit> SubjectVisit { get; set; }
#endregion
#region ClinicalQuestion
public virtual DbSet<TrialClinicalQuestion> TrialClinicalQuestion { get; set; }
public virtual DbSet<SystemClinicalQuestion> SystemClinicalQuestion { get; set; }
public virtual DbSet<SystemClinicalTableQuestion> SystemClinicalTableQuestion { get; set; }
public virtual DbSet<TrialClinicalTableQuestion> TrialClinicalTableQuestion { get; set; }
public virtual DbSet<ClinicalQuestionAnswer> ClinicalQuestionAnswer { get; set; }
public virtual DbSet<ClinicalAnswerRowInfo> ClinicalAnswerRowInfo { get; set; }
public virtual DbSet<ClinicalTableAnswer> ClinicalTableAnswer { get; set; }
public virtual DbSet<ReadModuleCriterionFrom> ReadModuleCriterionFrom { get; set; }
public virtual DbSet<ClinicalForm> ClinicalForm { get; set; }
#endregion
#region Document
public virtual DbSet<SystemDocument> SystemDocument { get; set; }
public virtual DbSet<TrialDocument> TrialDocument { get; set; }
public virtual DbSet<TrialDocNeedConfirmedUserType> TrialDocUserTypeConfirm { get; set; }
public virtual DbSet<SystemDocConfirmedUser> SystemDocConfirmedUser { get; set; }
public virtual DbSet<SystemDocNeedConfirmedUserType> SystemDocNeedConfirmedUserType { get; set; }
public virtual DbSet<TrialDocNeedConfirmedUserType> TrialDocNeedConfirmedUserType { get; set; }
public virtual DbSet<TrialDocConfirmedUser> TrialDocConfirmedUser { get; set; }
#endregion
#region 未分类
public virtual DbSet<ShortcutKey> ShortcutKey { get; set; }
public virtual DbSet<UserWLTemplate> UserWLTemplate { get; set; }
public virtual DbSet<EmailNoticeConfig> EmailNoticeConfig { get; set; }
public virtual DbSet<SystemBasicData> SystemBasicData { get; set; }
public virtual DbSet<TrialSign> TrialSign { get; set; }
public virtual DbSet<TrialStateChange> TrialStateChange { get; set; }
public virtual DbSet<SystemAnonymization> SystemAnonymization { get; set; }
public virtual DbSet<TrialExternalUser> TrialExternalUser { get; set; }
public virtual DbSet<UserTypeGroup> UserTypeGroup { get; set; }
public virtual DbSet<DataInspection> DataInspection { get; set; }
public virtual DbSet<FrontAuditConfig> FrontAuditConfig { get; set; }
public virtual DbSet<InspectionFile> InspectionFile { get; set; }
public virtual DbSet<CommonDocument> CommonDocument { get; set; }
public virtual DbSet<SystemNotice> SystemNotice { get; set; }
public virtual DbSet<SystemNoticeUserRead> SystemNoticeUserRead { get; set; }
public virtual DbSet<SystemNoticeUserType> SystemNoticeUserType { get; set; }
public virtual DbSet<ReadingTableQuestionAnswer> ReadingTableQuestionAnswer { get; set; }
public virtual DbSet<PublishLog> PublishLog { get; set; }
public virtual DbSet<UserLog> UserLog { get; set; }
public virtual DbSet<EmailNoticeUserType> EmailNoticeUserType { get; set; }
public virtual DbSet<TrialEmailBlackUser> TrialEmailBlackUser { get; set; }
public virtual DbSet<TrialBodyPart> TrialBodyPart { get; set; }
public virtual DbSet<ExploreRecommend> ExploreRecommend { get; set; }
public virtual DbSet<SCPPatient> SCPPatient { get; set; }
public virtual DbSet<SCPStudy> SCPStudy { get; set; }
public virtual DbSet<SCPSeries> SCPSeries { get; set; }
public virtual DbSet<SCPInstance> SCPInstance { get; set; }
public virtual DbSet<TrialDicomAE> TrialDicomAE { get; set; }
public virtual DbSet<TrialSiteDicomAE> TrialSiteDicomAE { get; set; }
public virtual DbSet<UserFeedBack> UserFeedBack { get; set; }
public virtual DbSet<TaskAllocationRule> TaskAllocationRule { get; set; }
public virtual DbSet<VisitTask> VisitTask { get; set; }
public virtual DbSet<SubjectUser> SubjectUser { get; set; }
public virtual DbSet<VisitTaskReReading> VisitTaskReReading { get; set; }
public virtual DbSet<TaskMedicalReview> TaskMedicalReview { get; set; }
public virtual DbSet<TaskMedicalReviewRule> TaskMedicalReviewRule { get; set; }
public virtual DbSet<TaskConsistentRule> TaskConsistentRule { get; set; }
public virtual DbSet<TaskInfluence> TaskInfluence { get; set; }
public virtual DbSet<SubjectCanceDoctor> SubjectCanceDoctor { get; set; }
public virtual DbSet<TrialEmailNoticeConfig> TrialEmailNoticeConfig { get; set; }
public virtual DbSet<TrialEmailNoticeUser> TrialEmailNoticeUser { get; set; }
public virtual DbSet<Internationalization> Internationalization { get; set; }
public virtual DbSet<TrialVirtualSiteCodeUpdate> TrialVirtualSiteCodeUpdate { get; set; }
public virtual DbSet<EnrollReadingCriterion> EnrollReadingCriterion { get; set; }
#endregion
public virtual DbSet<TrialImageDownload> TrialImageDownload { get; set; }
public virtual DbSet<TestLength> TestLength { get; set; }
public virtual DbSet<EventStoreRecord> EventStoreRecord { get; set; }
public virtual DbSet<SubjectPatient> SubjectPatient { get; set; }
public virtual DbSet<DicomAE> DicomAE { get; set; }
public virtual DbSet<SubjectPatientSCPStudy> SubjectPatientSCPStudy { get; set; }
public virtual DbSet<SCPImageUpload> SCPImageUpload { get; set; }
public virtual DbSet<SubejctVisitDownload> SubejctVisitDownload { get; set; }
public virtual DbSet<PIAudit> PIAudit { get; set; }
public virtual DbSet<SCPStudySubjectVisit> SCPStudySubjectVisit { get; set; }
public virtual DbSet<SubjectVisitClinicalDialog> SubjectVisitClinicalDialog { get; set; }
public virtual DbSet<HIRHospital> HIRHospital { get; set; }
}
public class TestLength : Entity
{
public string Name { get; set; }
[StringLength(1000)]
public string[] StringList { get; set; }=new string[] { };
public List<DateTime> DateTimeList { get; set; } = new List<DateTime>();
[StringLength(1000)]
public List<TestEnum> TestEnumList { get; set; } = new List<TestEnum>();
public List<TestJsonObject> TestJsonObjectLsit { get; set; }
public DateOnly? TestDate { get; set; }
}
public record TestJsonObject
{
public string Name { get; set; }
public string Description { get; set; }
}
public enum TestEnum
{
Default = 0,
First = 1
}