Я хотел бы разделить на части мой класс DbContext
, чтобы каждый модуль имел свой собственный класс, который, как я считаю, упрощает работу, увеличивает количество ошибок и снижает сложность кода.
Я полагаю, что видел это где-то в прошлом, когда гуглил, но не нашел.
Мой DbContext
находится на уровне инфраструктуры, а мои классы — в контексте домена. Это не проблема. Я хотел бы разделить сопоставления и конфигурации на отдельные классы. Мой DbContext
останется прежним, за исключением того, что он будет разделен.
Ниже я отметил области кода, которые хочу разбить на части:
public class WestCoreDbContext : DbContext
{
public WestCoreDbContext(DbContextOptions<WestCoreDbContext> options) : base(options)
{
}
#region WOULD LIKE TO SPLIT THIS PART
public virtual DbSet<SoftwareTest> SoftwareTests { get; set; }
public virtual DbSet<SoftwareTestCase> SoftwareTestCases { get; set; }
public virtual DbSet<SoftwareTestCaseStep> SoftwareTestCaseSteps { get; set; }
public virtual DbSet<SoftwareTestCaseStepResult> SoftwareTestCaseStepResults { get; set; }
public virtual DbSet<Position> Positions { get; set; }
#endregion
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region WOULD LIKE TO SPLIT THIS PART
SoftwareTestMapping(modelBuilder);
SoftwareTestCaseMapping(modelBuilder);
SoftwareTestCaseMapping(modelBuilder);
SoftwareTestCaseStepMapping(modelBuilder);
SoftwareTestCaseStepResultsMapping(modelBuilder);
PositionMapping(modelBuilder);
RelationshipsMapping(modelBuilder);
#endregion
modelBuilder.MyOracleNamingConventions();
base.OnModelCreating(modelBuilder);
}
#region WOULD LIKE TO SPLIT THIS PART
private void SoftwareTestMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SoftwareTest>();
}
private void SoftwareTestCaseMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SoftwareTestCase>();
}
private void SoftwareTestCaseStepMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SoftwareTestCaseStep>();
}
private void PositionMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Position>();
}
private void SoftwareTestCaseStepResultsMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SoftwareTestCaseStepResult>();
}
private void RelationshipsMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SoftwareTest>().HasMany(x => x.SoftwareTestCases).WithOne(op => op.SoftwareTest).IsRequired().HasForeignKey(@"StId");
modelBuilder.Entity<SoftwareTestCase>().HasOne(x => x.SoftwareTest).WithMany(op => op.SoftwareTestCases).IsRequired().HasForeignKey(@"StId");
modelBuilder.Entity<SoftwareTestCase>().HasMany(x => x.SoftwareTestCaseSteps).WithOne(op => op.SoftwareTestCase).IsRequired().HasForeignKey("StcId");
modelBuilder.Entity<SoftwareTestCaseStep>().HasOne(x => x.SoftwareTestCase).WithMany(op => op.SoftwareTestCaseSteps).IsRequired().HasForeignKey("StcId");
modelBuilder.Entity<SoftwareTestCaseStep>().HasMany(x => x.SoftwareTestCaseStepResults).WithOne(op => op.SoftwareTestCaseStep).IsRequired().HasForeignKey("StcsId");
modelBuilder.Entity<SoftwareTestCaseStepResult>().HasOne(x => x.SoftwareTestCaseStep).WithMany(op => op.SoftwareTestCaseStepResults).IsRequired().HasForeignKey("StcsId");
}
#endregion
public bool HasChanges()
{
return ChangeTracker.Entries().Any(e => e.State == EntityState.Added || e.State == EntityState.Modified || e.State == EntityState.Deleted);
}
...
}
}
Я не знаю точного способа разделения DbContext. Мне нужен способ сделать это. Вы можете предоставить мне решение?
context.Set<T>()
всегда будет предоставлять доступ ко всем отображаемым объектам в контексте. Это может быть один из тех редких случаев, когда оправдан дополнительный уровень абстракции Unit of Work/Generic Repository. Также обратите внимание, что скомпилированная модель, принадлежащая одному классу контекста, будет построена только один раз за время жизни приложения. Вы не можете скомпилировать модель для каждого экземпляра (ну, это возможно, но не рекомендуется). Поэтому, если это то, что вы подразумеваете под разделением, имейте в виду, что для этого вам нужны разные контекстные классы. - person Gert Arnold   schedule 13.12.2017