-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathBusinessLayerDbContext.cs
98 lines (84 loc) · 4.97 KB
/
BusinessLayerDbContext.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using Havit.Data.EntityFrameworkCore.BusinessLayer.ExtendedProperties;
using Havit.Data.EntityFrameworkCore.BusinessLayer.Metadata.Conventions;
using Havit.Data.EntityFrameworkCore.BusinessLayer.ModelExtensions;
using Havit.Data.EntityFrameworkCore.Metadata.Conventions;
using Havit.Data.EntityFrameworkCore.Migrations.Extensions;
using Microsoft.EntityFrameworkCore;
namespace Havit.Data.EntityFrameworkCore.BusinessLayer;
/// <summary>
/// Bázová trieda pre <see cref="DbContext"/> používaný v Business Layer projektoch. Mal by sa používať výhradne pre správu schémy DB.
/// </summary>
/// <remarks>
/// Pridáva podporu pre extended properties a DB Injections a ich spoločnú infraštruktúru. Definuje rôzne konvencie používané na Business Layer projektoch.
/// </remarks>
public abstract class BusinessLayerDbContext : DbContext
{
/// <summary>
/// Konstruktor.
/// </summary>
protected BusinessLayerDbContext() : this(new DbContextOptions<BusinessLayerDbContext>())
{
}
/// <summary>
/// Konstruktor.
/// </summary>
protected BusinessLayerDbContext(DbContextOptions options)
: base(options)
{
}
/// <summary>
/// Vrací konfiguraci konvencí pro BusinessLayerDbContextu.
/// </summary>
protected virtual BusinessLayerDbContextSettings CreateDbContextSettings()
{
return new BusinessLayerDbContextSettings
{
ModelExtensionsAssembly = GetType().Assembly
};
}
/// <inheritdoc />
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
// Sice není ideální ve frameworku použít OnConfiguring, nicméně použití BusinessLayerDbContextu se nepředpokládá tam, kde toto bude blokující pro použití DbContextu (např. pooled db connection)
BusinessLayerDbContextSettings settings = CreateDbContextSettings();
#pragma warning disable CS0618 // Type or member is obsolete
optionsBuilder.UseModelExtensions(builder => builder
.ModelExtensionsAssembly(settings.ModelExtensionsAssembly)
.UseStoredProcedures()
.UseExtendedProperties()
.UseBusinessLayerStoredProcedures()
.UseViews());
#pragma warning restore CS0618 // Type or member is obsolete
optionsBuilder.UseSqlServerExtendedProperties();
optionsBuilder.ConditionalyUseConventionSetPlugin<CollectionExtendedPropertiesConventionPlugin>(() => settings.UseCollectionExtendedPropertiesConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<CollectionOrderIndexConventionPlugin>(() => settings.UseCollectionOrderIndexConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<ExtendedPropertiesConventionPlugin>(() => settings.UseAttributeBasedExtendedPropertiesConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<DefaultValueAttributeConventionPlugin>(() => settings.UseDefaultValueAttributeConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<DefaultValueSqlAttributeConventionPlugin>(() => settings.UseDefaultValueSqlAttributeConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<CharColumnTypeForCharPropertyConventionPlugin>(() => settings.UseCharColumnTypeForCharPropertyConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<NamespaceExtendedPropertyConventionPlugin>(() => settings.UseNamespaceExtendedPropertyConvention);
// reagují na přidání cizího klíče, naše konvence musíme dostat před tvorbu indexů vestavěnou v EF Core
optionsBuilder.ConditionalyUseConventionSetPlugin<ForeignKeysColumnNamesConventionPlugin>(() => settings.UseForeignKeysColumnNamesConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<PrefixedTablePrimaryKeysConventionPlugin>(() => settings.UsePrefixedTablePrimaryKeysConvention);
// konvence používá primární klíč nastavený v předchozí konvenci
optionsBuilder.ConditionalyUseConventionSetPlugin<LocalizationTablesParentEntitiesConventionPlugin>(() => settings.UseLocalizationTablesParentEntitiesConvention);
// reagují na přidání cizího klíče, konvenci musíme dostat před tvorbu indexů vestavěnou v EF Core, ale až za naše předchozí konvence
optionsBuilder.ConditionalyUseConventionSetPlugin<ForeignKeysIndexConventionPlugin>(() => settings.UseForeignKeysIndexConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<LanguageUiCultureIndexConventionPlugin>(() => settings.UseLanguageUiCultureIndexConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<LocalizationTableIndexConventionPlugin>(() => settings.LocalizationTableIndexConvention);
optionsBuilder.ConditionalyUseConventionSetPlugin<XmlCommentsForDescriptionPropertyConventionPlugin>(() => settings.UseXmlCommentsForDescriptionPropertyConvention);
}
protected override ConventionsOptions GetConventionOptions()
{
return base.GetConventionOptions() with
{
StringPropertiesDefaultValueConventionEnabled = true,
LocalizationTableIndexConventionEnabled = false
};
}
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.AddModelExtensionRegistrationConvention();
}
}