using Abp.BackgroundJobs;
using Abp.Notifications;
using Microsoft.EntityFrameworkCore;
using VberZero.BaseSystem;
using VberZero.BaseSystem.MultiTenancy;
using VberZero.BaseSystem.Users;
using VberZero.Workflow;
using VberZero.Workflow.DesignInfo;
using VberZero.Workflow.Persistence;
namespace VberZero.EntityFramework;
///
/// Vber Zero的基础 DbContext。
/// 从此类派生您的 DbContext 以拥有基本实体。
///
public abstract class VzDbContext : VzCommonDbContext
where TSelf : VzDbContext
{
///
/// Tenants
///
public virtual DbSet Tenants { get; set; }
public virtual DbSet BackgroundJobs { get; set; }
public virtual DbSet UserAccounts { get; set; }
public virtual DbSet Notifications { get; set; }
#region WORKFLOW
public DbSet WorkflowEvents { get; set; }
public DbSet WorkflowExecutionErrors { get; set; }
public DbSet WorkflowExecutionPointers { get; set; }
public DbSet WorkflowExtensionAttributes { get; set; }
public DbSet WorkflowSubscriptions { get; set; }
public DbSet WorkflowWorkflows { get; set; }
public DbSet WorkflowWorkflowDefinitions { get; set; }
public DbSet CommonWorkflowAuditors { get; set; }
#endregion WORKFLOW
/////
///// Editions.
/////
//public virtual DbSet Editions { get; set; }
/////
///// FeatureSettings.
/////
//public virtual DbSet FeatureSettings { get; set; }
/////
///// TenantFeatureSetting.
/////
//public virtual DbSet TenantFeatureSettings { get; set; }
/////
///// EditionFeatureSettings.
/////
//public virtual DbSet EditionFeatureSettings { get; set; }
///
///
///
///
protected VzDbContext(DbContextOptions options)
: base(options)
{
}
///
///
///
///
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ChangeTablePrefix();
modelBuilder.Entity(b =>
{
b.HasIndex(e => new { e.IsAbandoned, e.NextTryTime });
});
modelBuilder.Entity(b =>
{
b.HasOne(p => p.DeleterUser)
.WithMany()
.HasForeignKey(p => p.DeleterUserId);
b.HasOne(p => p.CreatorUser)
.WithMany()
.HasForeignKey(p => p.CreatorUserId);
b.HasOne(p => p.LastModifierUser)
.WithMany()
.HasForeignKey(p => p.LastModifierUserId);
b.HasIndex(e => e.TenancyName);
});
modelBuilder.Entity(b =>
{
b.HasIndex(e => new { e.TenantId, e.UserId });
b.HasIndex(e => new { e.TenantId, e.UserName });
b.HasIndex(e => new { e.TenantId, e.EmailAddress });
b.HasIndex(e => new { e.UserName });
b.HasIndex(e => new { e.EmailAddress });
});
#region AuditLog.Set_MaxLengths
modelBuilder.Entity()
.Property(e => e.ServiceName)
.HasMaxLength(AuditLog.MaxServiceNameLength);
modelBuilder.Entity()
.Property(e => e.MethodName)
.HasMaxLength(AuditLog.MaxMethodNameLength);
modelBuilder.Entity()
.Property(e => e.Parameters)
.HasMaxLength(AuditLog.MaxParametersLength);
modelBuilder.Entity()
.Property(e => e.ClientIpAddress)
.HasMaxLength(AuditLog.MaxClientIpAddressLength);
modelBuilder.Entity()
.Property(e => e.ClientName)
.HasMaxLength(AuditLog.MaxClientNameLength);
modelBuilder.Entity()
.Property(e => e.BrowserInfo)
.HasMaxLength(AuditLog.MaxBrowserInfoLength);
modelBuilder.Entity()
.Property(e => e.ExceptionMessage)
.HasMaxLength(AuditLog.MaxExceptionMessageLength);
modelBuilder.Entity()
.Property(e => e.Exception)
.HasMaxLength(AuditLog.MaxExceptionLength);
modelBuilder.Entity()
.Property(e => e.CustomData)
.HasMaxLength(AuditLog.MaxCustomDataLength);
#endregion AuditLog.Set_MaxLengths
//modelBuilder.Entity(b =>
//{
// b.HasIndex(e => new { e.TenantId, e.Name });
//});
//modelBuilder.Entity(b =>
//{
// b.HasIndex(e => new { e.EditionId, e.Name });
//});
modelBuilder.ConfigWorkflow();
}
}