feat(configdb): EF mappings + DbSets for native alarm source entities

This commit is contained in:
Joseph Doherty
2026-05-29 15:52:33 -04:00
parent 913441972e
commit 63f1ec282f
4 changed files with 108 additions and 0 deletions
@@ -53,10 +53,40 @@ public class InstanceConfiguration : IEntityTypeConfiguration<Instance>
.HasForeignKey(b => b.InstanceId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(i => i.NativeAlarmSourceOverrides)
.WithOne()
.HasForeignKey(o => o.InstanceId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasIndex(i => new { i.SiteId, i.UniqueName }).IsUnique();
}
}
public class InstanceNativeAlarmSourceOverrideConfiguration : IEntityTypeConfiguration<InstanceNativeAlarmSourceOverride>
{
/// <summary>Configures the EF Core mapping for <see cref="InstanceNativeAlarmSourceOverride"/>.</summary>
/// <param name="builder">The entity type builder.</param>
public void Configure(EntityTypeBuilder<InstanceNativeAlarmSourceOverride> builder)
{
builder.HasKey(o => o.Id);
builder.Property(o => o.SourceCanonicalName)
.IsRequired()
.HasMaxLength(400); // Larger than names to fit composed paths.
builder.Property(o => o.ConnectionNameOverride)
.HasMaxLength(200);
builder.Property(o => o.SourceReferenceOverride)
.HasMaxLength(1000);
builder.Property(o => o.ConditionFilterOverride)
.HasMaxLength(1000);
builder.HasIndex(o => new { o.InstanceId, o.SourceCanonicalName }).IsUnique();
}
}
public class InstanceAttributeOverrideConfiguration : IEntityTypeConfiguration<InstanceAttributeOverride>
{
/// <summary>Configures the EF Core mapping for <see cref="InstanceAttributeOverride"/>.</summary>
@@ -58,6 +58,41 @@ public class TemplateConfiguration : IEntityTypeConfiguration<Template>
.WithOne()
.HasForeignKey(c => c.TemplateId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(t => t.NativeAlarmSources)
.WithOne()
.HasForeignKey(s => s.TemplateId)
.OnDelete(DeleteBehavior.Cascade);
}
}
public class TemplateNativeAlarmSourceConfiguration : IEntityTypeConfiguration<TemplateNativeAlarmSource>
{
/// <summary>Configures the EF Core mapping for <see cref="TemplateNativeAlarmSource"/>.</summary>
/// <param name="builder">The entity type builder.</param>
public void Configure(EntityTypeBuilder<TemplateNativeAlarmSource> builder)
{
builder.HasKey(s => s.Id);
builder.Property(s => s.Name)
.IsRequired()
.HasMaxLength(200);
builder.Property(s => s.Description)
.HasMaxLength(2000);
builder.Property(s => s.ConnectionName)
.IsRequired()
.HasMaxLength(200);
builder.Property(s => s.SourceReference)
.IsRequired()
.HasMaxLength(1000);
builder.Property(s => s.ConditionFilter)
.HasMaxLength(1000);
builder.HasIndex(s => new { s.TemplateId, s.Name }).IsUnique();
}
}
@@ -55,6 +55,8 @@ public class ScadaBridgeDbContext : DbContext, IDataProtectionKeyContext
public DbSet<TemplateComposition> TemplateCompositions => Set<TemplateComposition>();
/// <summary>Gets the set of template folders.</summary>
public DbSet<TemplateFolder> TemplateFolders => Set<TemplateFolder>();
/// <summary>Gets the set of template native alarm source bindings.</summary>
public DbSet<TemplateNativeAlarmSource> TemplateNativeAlarmSources => Set<TemplateNativeAlarmSource>();
// Instances
/// <summary>Gets the set of instances.</summary>
@@ -65,6 +67,8 @@ public class ScadaBridgeDbContext : DbContext, IDataProtectionKeyContext
public DbSet<InstanceAlarmOverride> InstanceAlarmOverrides => Set<InstanceAlarmOverride>();
/// <summary>Gets the set of instance connection bindings.</summary>
public DbSet<InstanceConnectionBinding> InstanceConnectionBindings => Set<InstanceConnectionBinding>();
/// <summary>Gets the set of instance native alarm source overrides.</summary>
public DbSet<InstanceNativeAlarmSourceOverride> InstanceNativeAlarmSourceOverrides => Set<InstanceNativeAlarmSourceOverride>();
/// <summary>Gets the set of areas.</summary>
public DbSet<Area> Areas => Set<Area>();
@@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Templates;
using ZB.MOM.WW.ScadaBridge.ConfigurationDatabase;
namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Tests;
public class NativeAlarmSourceSchemaTests
{
private static ScadaBridgeDbContext NewContext()
{
var opts = new DbContextOptionsBuilder<ScadaBridgeDbContext>()
.UseSqlite("DataSource=:memory:")
.Options;
var ctx = new ScadaBridgeDbContext(opts);
ctx.Database.OpenConnection();
ctx.Database.EnsureCreated();
return ctx;
}
[Fact]
public async Task TemplateNativeAlarmSource_PersistsViaTemplate()
{
using var ctx = NewContext();
var t = new Template("T1");
t.NativeAlarmSources.Add(new TemplateNativeAlarmSource("Src1") { ConnectionName = "C", SourceReference = "r" });
ctx.Templates.Add(t);
await ctx.SaveChangesAsync();
Assert.Single(ctx.TemplateNativeAlarmSources);
}
[Fact]
public async Task InstanceNativeAlarmSourceOverride_DbSetIsMapped()
{
using var ctx = NewContext();
Assert.Equal(0, await ctx.InstanceNativeAlarmSourceOverrides.CountAsync());
}
}