Skip to content

Commit 07cf3f5

Browse files
refactor: entity configurations to use OnModelConfiguring methods (#331)
* refactor: entity configurations to use OnModelConfiguring methods * refactor: update EntityFrameworkCore package references in project file
1 parent f6ce7eb commit 07cf3f5

29 files changed

Lines changed: 585 additions & 521 deletions

PrismaDotnetApi/PrismaApi.Domain/Entities/Assessment.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using PrismaApi.Domain.Constants;
13
using PrismaApi.Domain.Interfaces;
2-
using System.ComponentModel.DataAnnotations.Schema;
34

45
namespace PrismaApi.Domain.Entities;
56

@@ -14,4 +15,26 @@ public class Assessment : AuditableEntity, IBaseEntity<Guid>
1415
public bool IsCompleted { get; set; } = false;
1516
public Project? Project { get; set; }
1617
public ICollection<DecisionQualityAssessment> DecisionQualityAssessments { get; set; } = new List<DecisionQualityAssessment>();
18+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
19+
{
20+
modelBuilder.Entity<Assessment>(static entity =>
21+
{
22+
entity.ToTable("Assessments");
23+
entity.HasKey(e => e.Id);
24+
entity.Property(e => e.Name).HasMaxLength(DomainConstants.MaxShortStringLength);
25+
entity.HasOne(e => e.CreatedBy)
26+
.WithMany()
27+
.HasForeignKey(e => e.CreatedById)
28+
.OnDelete(DeleteBehavior.Restrict);
29+
30+
entity.HasOne(e => e.UpdatedBy)
31+
.WithMany()
32+
.HasForeignKey(e => e.UpdatedById)
33+
.OnDelete(DeleteBehavior.Restrict);
34+
entity.HasMany(e => e.DecisionQualityAssessments)
35+
.WithOne(e => e.Assessment)
36+
.HasForeignKey(e => e.AssessmentId)
37+
.OnDelete(DeleteBehavior.Cascade);
38+
});
39+
}
1740
}

PrismaDotnetApi/PrismaApi.Domain/Entities/AuditableEntity.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using System.ComponentModel.DataAnnotations.Schema;
2-
31
namespace PrismaApi.Domain.Entities;
42

53
public abstract class AuditableEntity : BaseEntity

PrismaDotnetApi/PrismaApi.Domain/Entities/BaseEntity.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
using System;
2-
using System.ComponentModel.DataAnnotations.Schema;
3-
41
namespace PrismaApi.Domain.Entities;
52

63
public abstract class BaseEntity

PrismaDotnetApi/PrismaApi.Domain/Entities/BoardNode.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Microsoft.EntityFrameworkCore;
12
using PrismaApi.Domain.Constants;
23
using PrismaApi.Domain.Interfaces;
34

@@ -20,4 +21,29 @@ public class BoardNode : AuditableEntity, IBaseEntity<Guid>
2021
// opacity: between 0 and 100
2122
public int Opacity { get; set; } = 100;
2223
public Project? Project { get; set; }
24+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
25+
{
26+
modelBuilder.Entity<BoardNode>(entity =>
27+
{
28+
entity.ToTable("BoardNode");
29+
entity.HasKey(e => e.Id);
30+
entity.Property(e => e.Color).HasMaxLength(DomainConstants.MaxShortStringLength);
31+
entity.Property(e => e.Opacity)
32+
.HasDefaultValue(100);
33+
entity.Property(e => e.StrokeStyle)
34+
.HasDefaultValue(BoardNodeStrokeStyles.Solid.ToString());
35+
entity.Property(e => e.StrokeWidth)
36+
.HasDefaultValue(8);
37+
entity.Property(e => e.Type).HasMaxLength(DomainConstants.MaxShortStringLength);
38+
entity.HasOne(e => e.CreatedBy)
39+
.WithMany()
40+
.HasForeignKey(e => e.CreatedById)
41+
.OnDelete(DeleteBehavior.Restrict);
42+
43+
entity.HasOne(e => e.UpdatedBy)
44+
.WithMany()
45+
.HasForeignKey(e => e.UpdatedById)
46+
.OnDelete(DeleteBehavior.Restrict);
47+
});
48+
}
2349
}

PrismaDotnetApi/PrismaApi.Domain/Entities/Decision.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using PrismaApi.Domain.Constants;
13
using PrismaApi.Domain.Interfaces;
2-
using System;
3-
using System.Collections.Generic;
4-
using System.ComponentModel.DataAnnotations.Schema;
54

65
namespace PrismaApi.Domain.Entities;
76

@@ -14,4 +13,22 @@ public class Decision : BaseEntity, IBaseEntity<Guid>
1413
public Issue? Issue { get; set; }
1514
public Project? Project { get; set; }
1615
public ICollection<Option> Options { get; set; } = new List<Option>();
16+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
17+
{
18+
modelBuilder.Entity<Decision>(entity =>
19+
{
20+
entity.HasKey(e => e.Id);
21+
entity.Property(e => e.Type).HasMaxLength(DomainConstants.MaxShortStringLength);
22+
23+
entity.HasOne(e => e.Project)
24+
.WithMany()
25+
.HasForeignKey(e => e.ProjectId)
26+
.OnDelete(DeleteBehavior.NoAction); // Cascade path already exists via Projects -> Issues -> Decisions
27+
28+
entity.HasMany(e => e.Options)
29+
.WithOne(e => e.Decision)
30+
.HasForeignKey(e => e.DecisionId)
31+
.OnDelete(DeleteBehavior.Cascade);
32+
});
33+
}
1734
}

PrismaDotnetApi/PrismaApi.Domain/Entities/DecisionQualityAssessment.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using PrismaApi.Domain.Constants;
13
using PrismaApi.Domain.Interfaces;
2-
using System.ComponentModel.DataAnnotations.Schema;
34

45
namespace PrismaApi.Domain.Entities;
56

@@ -18,4 +19,28 @@ public class DecisionQualityAssessment : AuditableEntity, IBaseEntity<Guid>
1819
public required Guid ProjectId { get; set; }
1920
public Assessment? Assessment { get; set; }
2021
public Project? Project { get; set; }
22+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
23+
{
24+
modelBuilder.Entity<DecisionQualityAssessment>(entity =>
25+
{
26+
entity.ToTable("DecisionQualityAssessments");
27+
entity.HasKey(e => e.Id);
28+
entity.Property(e => e.Comment).HasMaxLength(DomainConstants.MaxLongStringLength);
29+
30+
entity.HasOne(e => e.Project)
31+
.WithMany()
32+
.HasForeignKey(e => e.ProjectId)
33+
.OnDelete(DeleteBehavior.NoAction); // Cascade path already exists via Projects -> Assessments -> DecisionQualityAssessments
34+
35+
entity.HasOne(e => e.CreatedBy)
36+
.WithMany()
37+
.HasForeignKey(e => e.CreatedById)
38+
.OnDelete(DeleteBehavior.Restrict);
39+
40+
entity.HasOne(e => e.UpdatedBy)
41+
.WithMany()
42+
.HasForeignKey(e => e.UpdatedById)
43+
.OnDelete(DeleteBehavior.Restrict);
44+
});
45+
}
2146
}

PrismaDotnetApi/PrismaApi.Domain/Entities/DiscreteProbability.cs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using PrismaApi.Domain.Constants;
13
using PrismaApi.Domain.Interfaces;
2-
using System;
3-
using System.Collections.Generic;
4-
using System.ComponentModel.DataAnnotations.Schema;
54

65
namespace PrismaApi.Domain.Entities;
76

@@ -19,4 +18,39 @@ public class DiscreteProbability : BaseEntity, IBaseEntity<Guid>
1918

2019
public ICollection<DiscreteProbabilityParentOutcome> ParentOutcomes { get; set; } = new List<DiscreteProbabilityParentOutcome>();
2120
public ICollection<DiscreteProbabilityParentOption> ParentOptions { get; set; } = new List<DiscreteProbabilityParentOption>();
21+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
22+
{
23+
modelBuilder.Entity<DiscreteProbability>(entity =>
24+
{
25+
entity.HasKey(e => e.Id);
26+
entity.HasIndex(e => e.OutcomeId);
27+
entity.HasIndex(e => e.UncertaintyId);
28+
entity.Property(e => e.Probability).HasPrecision(DomainConstants.FloatPrecision);
29+
30+
entity.HasOne(e => e.Project)
31+
.WithMany()
32+
.HasForeignKey(e => e.ProjectId)
33+
.OnDelete(DeleteBehavior.NoAction); // Cascade path already exists via Projects -> Issues -> Uncertainties -> Outcomes -> DiscreteProbabilities
34+
35+
entity.HasOne(e => e.Outcome)
36+
.WithMany()
37+
.HasForeignKey(e => e.OutcomeId)
38+
.OnDelete(DeleteBehavior.Cascade);
39+
40+
entity.HasOne(e => e.Uncertainty)
41+
.WithMany(e => e.DiscreteProbabilities)
42+
.HasForeignKey(e => e.UncertaintyId)
43+
.OnDelete(DeleteBehavior.NoAction);
44+
45+
entity.HasMany(e => e.ParentOutcomes)
46+
.WithOne(e => e.DiscreteProbability)
47+
.HasForeignKey(e => e.DiscreteProbabilityId)
48+
.OnDelete(DeleteBehavior.Cascade);
49+
50+
entity.HasMany(e => e.ParentOptions)
51+
.WithOne(e => e.DiscreteProbability)
52+
.HasForeignKey(e => e.DiscreteProbabilityId)
53+
.OnDelete(DeleteBehavior.Cascade);
54+
});
55+
}
2256
}

PrismaDotnetApi/PrismaApi.Domain/Entities/DiscreteProbabilityParentOption.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using System.ComponentModel.DataAnnotations.Schema;
1+
using Microsoft.EntityFrameworkCore;
32

43
namespace PrismaApi.Domain.Entities;
54

@@ -10,4 +9,21 @@ public class DiscreteProbabilityParentOption
109

1110
public DiscreteProbability? DiscreteProbability { get; set; }
1211
public Option? ParentOption { get; set; }
12+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
13+
{
14+
modelBuilder.Entity<DiscreteProbabilityParentOption>(entity =>
15+
{
16+
entity.HasKey(e => new { e.DiscreteProbabilityId, e.ParentOptionId });
17+
18+
entity.HasOne(e => e.DiscreteProbability)
19+
.WithMany(d => d.ParentOptions)
20+
.HasForeignKey(e => e.DiscreteProbabilityId)
21+
.OnDelete(DeleteBehavior.Cascade);
22+
23+
entity.HasOne(e => e.ParentOption)
24+
.WithMany()
25+
.HasForeignKey(e => e.ParentOptionId)
26+
.OnDelete(DeleteBehavior.NoAction);
27+
});
28+
}
1329
}

PrismaDotnetApi/PrismaApi.Domain/Entities/DiscreteProbabilityParentOutcome.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using System.ComponentModel.DataAnnotations.Schema;
1+
using Microsoft.EntityFrameworkCore;
32

43
namespace PrismaApi.Domain.Entities;
54

@@ -10,4 +9,21 @@ public class DiscreteProbabilityParentOutcome
109

1110
public DiscreteProbability? DiscreteProbability { get; set; }
1211
public Outcome? ParentOutcome { get; set; }
12+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
13+
{
14+
modelBuilder.Entity<DiscreteProbabilityParentOutcome>(entity =>
15+
{
16+
entity.HasKey(e => new { e.DiscreteProbabilityId, e.ParentOutcomeId });
17+
18+
entity.HasOne(e => e.DiscreteProbability)
19+
.WithMany(d => d.ParentOutcomes)
20+
.HasForeignKey(e => e.DiscreteProbabilityId)
21+
.OnDelete(DeleteBehavior.Cascade);
22+
23+
entity.HasOne(e => e.ParentOutcome)
24+
.WithMany()
25+
.HasForeignKey(e => e.ParentOutcomeId)
26+
.OnDelete(DeleteBehavior.NoAction);
27+
});
28+
}
1329
}

PrismaDotnetApi/PrismaApi.Domain/Entities/DiscreteUtility.cs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using PrismaApi.Domain.Constants;
13
using PrismaApi.Domain.Interfaces;
2-
using System;
3-
using System.Collections.Generic;
4-
using System.ComponentModel.DataAnnotations.Schema;
54

65
namespace PrismaApi.Domain.Entities;
76

@@ -19,4 +18,39 @@ public class DiscreteUtility : BaseEntity, IBaseEntity<Guid>
1918

2019
public ICollection<DiscreteUtilityParentOutcome> ParentOutcomes { get; set; } = new List<DiscreteUtilityParentOutcome>();
2120
public ICollection<DiscreteUtilityParentOption> ParentOptions { get; set; } = new List<DiscreteUtilityParentOption>();
21+
public static void OnModelConfiguring(ModelBuilder modelBuilder)
22+
{
23+
modelBuilder.Entity<DiscreteUtility>(entity =>
24+
{
25+
entity.HasKey(e => e.Id);
26+
entity.HasIndex(e => e.ValueMetricId);
27+
entity.HasIndex(e => e.UtilityId);
28+
entity.Property(e => e.UtilityValue).HasPrecision(DomainConstants.FloatPrecision);
29+
30+
entity.HasOne(e => e.Project)
31+
.WithMany()
32+
.HasForeignKey(e => e.ProjectId)
33+
.OnDelete(DeleteBehavior.NoAction); // Cascade path already exists via Projects -> Issues -> Utilities -> DiscreteUtilities
34+
35+
entity.HasOne(e => e.ValueMetric)
36+
.WithMany()
37+
.HasForeignKey(e => e.ValueMetricId)
38+
.OnDelete(DeleteBehavior.Cascade);
39+
40+
entity.HasOne(e => e.Utility)
41+
.WithMany(e => e.DiscreteUtilities)
42+
.HasForeignKey(e => e.UtilityId)
43+
.OnDelete(DeleteBehavior.Cascade);
44+
45+
entity.HasMany(e => e.ParentOutcomes)
46+
.WithOne(e => e.DiscreteUtility)
47+
.HasForeignKey(e => e.DiscreteUtilityId)
48+
.OnDelete(DeleteBehavior.Cascade);
49+
50+
entity.HasMany(e => e.ParentOptions)
51+
.WithOne(e => e.DiscreteUtility)
52+
.HasForeignKey(e => e.DiscreteUtilityId)
53+
.OnDelete(DeleteBehavior.Cascade);
54+
});
55+
}
2256
}

0 commit comments

Comments
 (0)