-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDBcontext.cs
More file actions
124 lines (99 loc) · 4.34 KB
/
Copy pathDBcontext.cs
File metadata and controls
124 lines (99 loc) · 4.34 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using Microsoft.EntityFrameworkCore;
using System.Text.Json;
using Portfolio.Models;
namespace Portfolio.Data;
public class PortfolioDbContext : DbContext
{
public PortfolioDbContext(DbContextOptions<PortfolioDbContext> options)
: base(options)
{
}
public DbSet<CaseStudy> CaseStudies => Set<CaseStudy>();
public DbSet<SkillDomain> SkillDomains => Set<SkillDomain>();
public DbSet<Experience> Experiences => Set<Experience>();
public DbSet<Testimonial> Testimonials => Set<Testimonial>();
public DbSet<Certification> Certifications => Set<Certification>();
// NEW DbSets (optional but recommended for querying)
public DbSet<ImplementationStep> ImplementationSteps => Set<ImplementationStep>();
public DbSet<Metric> Metrics => Set<Metric>();
public DbSet<CaseStudySkill> CaseStudySkills => Set<CaseStudySkill>();
public DbSet<ArtifactLink> ArtifactLinks => Set<ArtifactLink>();
public DbSet<ArchitectureComponent> ArchitectureComponents => Set<ArchitectureComponent>();
public DbSet<ProjectBrief> ProjectBriefs {get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ProjectBrief>().HasKey(x => x.id);
modelBuilder.Entity<ProjectBrief>().Property(x => x.id).ValueGeneratedOnAdd();
// -------------------------
// JSON Conversions (KEEP ONLY WHAT YOU NEED)
// -------------------------
ConfigureJsonConversion<Experience, List<string>>(modelBuilder, e => e.Tags);
ConfigureJsonConversion<Experience, List<string>>(modelBuilder, e => e.Responsibilities);
// CaseStudy JSON sections
modelBuilder.Entity<CaseStudy>()
.Property(x => x.ProblemJson)
.HasColumnType("json");
modelBuilder.Entity<CaseStudy>()
.Property(x => x.SolutionJson)
.HasColumnType("json");
// -------------------------
// CaseStudy Relationships
// -------------------------
modelBuilder.Entity<CaseStudy>()
.HasMany(c => c.ImplementationSteps)
.WithOne(i => i.CaseStudy)
.HasForeignKey(i => i.CaseStudyId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<CaseStudy>()
.HasMany(c => c.Metrics)
.WithOne(m => m.CaseStudy)
.HasForeignKey(m => m.CaseStudyId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<CaseStudy>()
.HasMany(c => c.Skills)
.WithOne(s => s.CaseStudy)
.HasForeignKey(s => s.CaseStudyId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<CaseStudy>()
.HasMany(c => c.Artifacts)
.WithOne(a => a.CaseStudy)
.HasForeignKey(a => a.CaseStudyId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<CaseStudy>()
.HasMany(c => c.ArchitectureComponents)
.WithOne(a => a.CaseStudy)
.HasForeignKey(a => a.CaseStudyId)
.OnDelete(DeleteBehavior.Cascade);
// -------------------------
// Ordering Index (important for UI)
// -------------------------
modelBuilder.Entity<CaseStudy>()
.HasIndex(c => c.DisplayOrder);
modelBuilder.Entity<ImplementationStep>()
.HasIndex(i => new { i.CaseStudyId, i.Order });
// -------------------------
// Owned Collection (unchanged)
// -------------------------
modelBuilder.Entity<SkillDomain>()
.OwnsMany(s => s.Items, a =>
{
a.WithOwner().HasForeignKey("SkillDomainId");
a.Property<int>("Id");
a.HasKey("Id");
});
}
private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web);
private static void ConfigureJsonConversion<TEntity, TProperty>(
ModelBuilder modelBuilder,
System.Linq.Expressions.Expression<Func<TEntity, TProperty>> propertyExpression)
where TEntity : class
{
modelBuilder.Entity<TEntity>()
.Property(propertyExpression)
.HasConversion(
v => JsonSerializer.Serialize(v, JsonOptions),
v => JsonSerializer.Deserialize<TProperty>(v, JsonOptions)!
);
}
}