wip: doctor/cli/docs/api to vector db consolidation; api hardening for descriptions, tenant, and scopes; migrations and conversions of all DALs to EF v10
This commit is contained in:
@@ -17,15 +17,24 @@ Provide foundational data models, storage, and validation for Golden Set definit
|
||||
4. **Air-Gap Ready**: Validation supports offline mode without external lookups
|
||||
5. **Human-Readable**: YAML as primary format for git-friendliness
|
||||
|
||||
## DAL Technology
|
||||
- **Primary**: EF Core v10 DbContext (`EfCore/Context/GoldenSetDbContext.cs`) with 3 entities (definitions, targets, audit_log) in `golden_sets` schema.
|
||||
- **Compiled model**: `EfCore/CompiledModels/GoldenSetDbContextModel` generated for runtime performance.
|
||||
- **Legacy**: `PostgresGoldenSetStore` still uses NpgsqlDataSource directly (deferred from EF Core conversion). Mixed DAL acceptable per cutover strategy.
|
||||
- **SQL migrations remain authoritative**: EF models are scaffolded FROM the SQL schema, never the reverse.
|
||||
|
||||
## Dependencies
|
||||
- `BinaryIndex.Contracts` - Shared contracts and DTOs
|
||||
- `Npgsql` - PostgreSQL driver
|
||||
- `Npgsql.EntityFrameworkCore.PostgreSQL` - EF Core Npgsql provider
|
||||
- `Microsoft.EntityFrameworkCore` - EF Core v10
|
||||
- `YamlDotNet` - YAML serialization
|
||||
- `Microsoft.Extensions.*` - DI, Options, Logging, Caching
|
||||
|
||||
## Required Reading
|
||||
- `docs/modules/binary-index/golden-set-schema.md`
|
||||
- `docs-archived/implplan/SPRINT_20260110_012_001_BINDEX_golden_set_foundation.md`
|
||||
- `docs/db/EF_CORE_MODEL_GENERATION_STANDARDS.md`
|
||||
|
||||
## Test Strategy
|
||||
- Unit tests in `StellaOps.BinaryIndex.GoldenSet.Tests`
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
#pragma warning disable 219, 612, 618
|
||||
#nullable disable
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
|
||||
{
|
||||
[EntityFrameworkInternal]
|
||||
public partial class GoldenSetAuditLogEntityType
|
||||
{
|
||||
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
|
||||
{
|
||||
var runtimeEntityType = model.AddEntityType(
|
||||
"StellaOps.BinaryIndex.GoldenSet.EfCore.Models.GoldenSetAuditLogEntity",
|
||||
typeof(GoldenSetAuditLogEntity),
|
||||
baseEntityType,
|
||||
propertyCount: 8,
|
||||
namedIndexCount: 2,
|
||||
keyCount: 1);
|
||||
|
||||
var id = runtimeEntityType.AddProperty(
|
||||
"Id",
|
||||
typeof(Guid),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
valueGenerated: ValueGenerated.OnAdd,
|
||||
sentinel: Guid.Empty);
|
||||
id.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
id.AddAnnotation("Relational:ColumnName", "id");
|
||||
id.AddAnnotation("Relational:DefaultValueSql", "gen_random_uuid()");
|
||||
|
||||
var goldenSetId = runtimeEntityType.AddProperty(
|
||||
"GoldenSetId",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("GoldenSetId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<GoldenSetId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
goldenSetId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
goldenSetId.AddAnnotation("Relational:ColumnName", "golden_set_id");
|
||||
|
||||
var action = runtimeEntityType.AddProperty(
|
||||
"Action",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Action", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Action>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
action.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
action.AddAnnotation("Relational:ColumnName", "action");
|
||||
|
||||
var actorId = runtimeEntityType.AddProperty(
|
||||
"ActorId",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("ActorId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<ActorId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
actorId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
actorId.AddAnnotation("Relational:ColumnName", "actor_id");
|
||||
|
||||
var oldStatus = runtimeEntityType.AddProperty(
|
||||
"OldStatus",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("OldStatus", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<OldStatus>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
oldStatus.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
oldStatus.AddAnnotation("Relational:ColumnName", "old_status");
|
||||
|
||||
var newStatus = runtimeEntityType.AddProperty(
|
||||
"NewStatus",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("NewStatus", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<NewStatus>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
newStatus.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
newStatus.AddAnnotation("Relational:ColumnName", "new_status");
|
||||
|
||||
var details = runtimeEntityType.AddProperty(
|
||||
"Details",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Details", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Details>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
details.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
details.AddAnnotation("Relational:ColumnName", "details");
|
||||
details.AddAnnotation("Relational:ColumnType", "jsonb");
|
||||
|
||||
var timestamp = runtimeEntityType.AddProperty(
|
||||
"Timestamp",
|
||||
typeof(DateTime),
|
||||
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Timestamp", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Timestamp>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
valueGenerated: ValueGenerated.OnAdd,
|
||||
sentinel: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
|
||||
timestamp.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
timestamp.AddAnnotation("Relational:ColumnName", "timestamp");
|
||||
timestamp.AddAnnotation("Relational:DefaultValueSql", "NOW()");
|
||||
|
||||
var key = runtimeEntityType.AddKey(
|
||||
new[] { id });
|
||||
runtimeEntityType.SetPrimaryKey(key);
|
||||
key.AddAnnotation("Relational:Name", "audit_log_pkey");
|
||||
|
||||
var idx_audit_golden_set = runtimeEntityType.AddIndex(
|
||||
new[] { goldenSetId },
|
||||
name: "idx_audit_golden_set");
|
||||
|
||||
var idx_audit_timestamp = runtimeEntityType.AddIndex(
|
||||
new[] { timestamp },
|
||||
name: "idx_audit_timestamp");
|
||||
idx_audit_timestamp.AddAnnotation("Relational:IsDescending", new[] { true });
|
||||
|
||||
var idx_audit_actor = runtimeEntityType.AddIndex(
|
||||
new[] { actorId },
|
||||
name: "idx_audit_actor");
|
||||
|
||||
return runtimeEntityType;
|
||||
}
|
||||
|
||||
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
|
||||
{
|
||||
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:Schema", "golden_sets");
|
||||
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:TableName", "audit_log");
|
||||
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
|
||||
|
||||
Customize(runtimeEntityType);
|
||||
}
|
||||
|
||||
static partial void Customize(RuntimeEntityType runtimeEntityType);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
// <auto-generated />
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
|
||||
|
||||
#pragma warning disable 219, 612, 618
|
||||
#nullable disable
|
||||
|
||||
[assembly: DbContextModel(typeof(GoldenSetDbContext), typeof(GoldenSetDbContextModel))]
|
||||
@@ -0,0 +1,48 @@
|
||||
// <auto-generated />
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
|
||||
|
||||
#pragma warning disable 219, 612, 618
|
||||
#nullable disable
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
|
||||
{
|
||||
[DbContext(typeof(GoldenSetDbContext))]
|
||||
public partial class GoldenSetDbContextModel : RuntimeModel
|
||||
{
|
||||
private static readonly bool _useOldBehavior31751 =
|
||||
System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", out var enabled31751) && enabled31751;
|
||||
|
||||
static GoldenSetDbContextModel()
|
||||
{
|
||||
var model = new GoldenSetDbContextModel();
|
||||
|
||||
if (_useOldBehavior31751)
|
||||
{
|
||||
model.Initialize();
|
||||
}
|
||||
else
|
||||
{
|
||||
var thread = new System.Threading.Thread(RunInitialization, 10 * 1024 * 1024);
|
||||
thread.Start();
|
||||
thread.Join();
|
||||
|
||||
void RunInitialization()
|
||||
{
|
||||
model.Initialize();
|
||||
}
|
||||
}
|
||||
|
||||
model.Customize();
|
||||
_instance = (GoldenSetDbContextModel)model.FinalizeModel();
|
||||
}
|
||||
|
||||
private static GoldenSetDbContextModel _instance;
|
||||
public static IModel Instance => _instance;
|
||||
|
||||
partial void Initialize();
|
||||
|
||||
partial void Customize();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#pragma warning disable 219, 612, 618
|
||||
#nullable disable
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
|
||||
{
|
||||
public partial class GoldenSetDbContextModel
|
||||
{
|
||||
private GoldenSetDbContextModel()
|
||||
: base(skipDetectChanges: false, modelId: new Guid("b25d0a3e-8c4f-4e9b-a6d2-e7f1c3b82945"), entityTypeCount: 3)
|
||||
{
|
||||
}
|
||||
|
||||
partial void Initialize()
|
||||
{
|
||||
var definition = GoldenSetDefinitionEntityType.Create(this);
|
||||
var target = GoldenSetTargetEntityType.Create(this);
|
||||
var auditLog = GoldenSetAuditLogEntityType.Create(this);
|
||||
|
||||
GoldenSetDefinitionEntityType.CreateAnnotations(definition);
|
||||
GoldenSetTargetEntityType.CreateAnnotations(target);
|
||||
GoldenSetAuditLogEntityType.CreateAnnotations(auditLog);
|
||||
|
||||
AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
|
||||
AddAnnotation("ProductVersion", "10.0.0");
|
||||
AddAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
#pragma warning disable 219, 612, 618
|
||||
#nullable disable
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
|
||||
{
|
||||
[EntityFrameworkInternal]
|
||||
public partial class GoldenSetDefinitionEntityType
|
||||
{
|
||||
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
|
||||
{
|
||||
var runtimeEntityType = model.AddEntityType(
|
||||
"StellaOps.BinaryIndex.GoldenSet.EfCore.Models.GoldenSetDefinitionEntity",
|
||||
typeof(GoldenSetDefinitionEntity),
|
||||
baseEntityType,
|
||||
propertyCount: 15,
|
||||
namedIndexCount: 4,
|
||||
keyCount: 1);
|
||||
|
||||
var id = runtimeEntityType.AddProperty(
|
||||
"Id",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
afterSaveBehavior: PropertySaveBehavior.Throw);
|
||||
id.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
id.AddAnnotation("Relational:ColumnName", "id");
|
||||
|
||||
var component = runtimeEntityType.AddProperty(
|
||||
"Component",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Component", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Component>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
component.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
component.AddAnnotation("Relational:ColumnName", "component");
|
||||
|
||||
var contentDigest = runtimeEntityType.AddProperty(
|
||||
"ContentDigest",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("ContentDigest", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<ContentDigest>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
contentDigest.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
contentDigest.AddAnnotation("Relational:ColumnName", "content_digest");
|
||||
|
||||
var status = runtimeEntityType.AddProperty(
|
||||
"Status",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Status", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Status>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
status.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
status.AddAnnotation("Relational:ColumnName", "status");
|
||||
|
||||
var definitionYaml = runtimeEntityType.AddProperty(
|
||||
"DefinitionYaml",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("DefinitionYaml", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<DefinitionYaml>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
definitionYaml.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
definitionYaml.AddAnnotation("Relational:ColumnName", "definition_yaml");
|
||||
|
||||
var definitionJson = runtimeEntityType.AddProperty(
|
||||
"DefinitionJson",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("DefinitionJson", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<DefinitionJson>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
definitionJson.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
definitionJson.AddAnnotation("Relational:ColumnName", "definition_json");
|
||||
definitionJson.AddAnnotation("Relational:ColumnType", "jsonb");
|
||||
|
||||
var targetCount = runtimeEntityType.AddProperty(
|
||||
"TargetCount",
|
||||
typeof(int),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("TargetCount", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<TargetCount>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
sentinel: 0);
|
||||
targetCount.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
targetCount.AddAnnotation("Relational:ColumnName", "target_count");
|
||||
|
||||
var authorId = runtimeEntityType.AddProperty(
|
||||
"AuthorId",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("AuthorId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<AuthorId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
authorId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
authorId.AddAnnotation("Relational:ColumnName", "author_id");
|
||||
|
||||
var createdAt = runtimeEntityType.AddProperty(
|
||||
"CreatedAt",
|
||||
typeof(DateTime),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("CreatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<CreatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
valueGenerated: ValueGenerated.OnAdd,
|
||||
sentinel: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
|
||||
createdAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
createdAt.AddAnnotation("Relational:ColumnName", "created_at");
|
||||
createdAt.AddAnnotation("Relational:DefaultValueSql", "NOW()");
|
||||
|
||||
var reviewedBy = runtimeEntityType.AddProperty(
|
||||
"ReviewedBy",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("ReviewedBy", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<ReviewedBy>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
reviewedBy.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
reviewedBy.AddAnnotation("Relational:ColumnName", "reviewed_by");
|
||||
|
||||
var reviewedAt = runtimeEntityType.AddProperty(
|
||||
"ReviewedAt",
|
||||
typeof(DateTime?),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("ReviewedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<ReviewedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
reviewedAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
reviewedAt.AddAnnotation("Relational:ColumnName", "reviewed_at");
|
||||
|
||||
var sourceRef = runtimeEntityType.AddProperty(
|
||||
"SourceRef",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("SourceRef", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<SourceRef>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
sourceRef.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
sourceRef.AddAnnotation("Relational:ColumnName", "source_ref");
|
||||
|
||||
var tags = runtimeEntityType.AddProperty(
|
||||
"Tags",
|
||||
typeof(string[]),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Tags", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Tags>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
tags.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
tags.AddAnnotation("Relational:ColumnName", "tags");
|
||||
|
||||
var schemaVersion = runtimeEntityType.AddProperty(
|
||||
"SchemaVersion",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("SchemaVersion", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<SchemaVersion>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
schemaVersion.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
schemaVersion.AddAnnotation("Relational:ColumnName", "schema_version");
|
||||
|
||||
var updatedAt = runtimeEntityType.AddProperty(
|
||||
"UpdatedAt",
|
||||
typeof(DateTime),
|
||||
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("UpdatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<UpdatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
valueGenerated: ValueGenerated.OnAdd,
|
||||
sentinel: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
|
||||
updatedAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
updatedAt.AddAnnotation("Relational:ColumnName", "updated_at");
|
||||
updatedAt.AddAnnotation("Relational:DefaultValueSql", "NOW()");
|
||||
|
||||
var key = runtimeEntityType.AddKey(
|
||||
new[] { id });
|
||||
runtimeEntityType.SetPrimaryKey(key);
|
||||
key.AddAnnotation("Relational:Name", "definitions_pkey");
|
||||
|
||||
var idx_goldensets_component = runtimeEntityType.AddIndex(
|
||||
new[] { component },
|
||||
name: "idx_goldensets_component");
|
||||
|
||||
var idx_goldensets_status = runtimeEntityType.AddIndex(
|
||||
new[] { status },
|
||||
name: "idx_goldensets_status");
|
||||
|
||||
var idx_goldensets_digest = runtimeEntityType.AddIndex(
|
||||
new[] { contentDigest },
|
||||
name: "idx_goldensets_digest",
|
||||
unique: true);
|
||||
|
||||
var idx_goldensets_created = runtimeEntityType.AddIndex(
|
||||
new[] { createdAt },
|
||||
name: "idx_goldensets_created");
|
||||
idx_goldensets_created.AddAnnotation("Relational:IsDescending", new[] { true });
|
||||
|
||||
var idx_goldensets_component_status = runtimeEntityType.AddIndex(
|
||||
new[] { component, status },
|
||||
name: "idx_goldensets_component_status");
|
||||
|
||||
return runtimeEntityType;
|
||||
}
|
||||
|
||||
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
|
||||
{
|
||||
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:Schema", "golden_sets");
|
||||
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:TableName", "definitions");
|
||||
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
|
||||
|
||||
Customize(runtimeEntityType);
|
||||
}
|
||||
|
||||
static partial void Customize(RuntimeEntityType runtimeEntityType);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
#pragma warning disable 219, 612, 618
|
||||
#nullable disable
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
|
||||
{
|
||||
[EntityFrameworkInternal]
|
||||
public partial class GoldenSetTargetEntityType
|
||||
{
|
||||
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
|
||||
{
|
||||
var runtimeEntityType = model.AddEntityType(
|
||||
"StellaOps.BinaryIndex.GoldenSet.EfCore.Models.GoldenSetTargetEntity",
|
||||
typeof(GoldenSetTargetEntity),
|
||||
baseEntityType,
|
||||
propertyCount: 9,
|
||||
namedIndexCount: 1,
|
||||
keyCount: 1);
|
||||
|
||||
var id = runtimeEntityType.AddProperty(
|
||||
"Id",
|
||||
typeof(Guid),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
valueGenerated: ValueGenerated.OnAdd,
|
||||
sentinel: Guid.Empty);
|
||||
id.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
id.AddAnnotation("Relational:ColumnName", "id");
|
||||
id.AddAnnotation("Relational:DefaultValueSql", "gen_random_uuid()");
|
||||
|
||||
var goldenSetId = runtimeEntityType.AddProperty(
|
||||
"GoldenSetId",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("GoldenSetId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<GoldenSetId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
goldenSetId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
goldenSetId.AddAnnotation("Relational:ColumnName", "golden_set_id");
|
||||
|
||||
var functionName = runtimeEntityType.AddProperty(
|
||||
"FunctionName",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("FunctionName", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<FunctionName>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
functionName.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
functionName.AddAnnotation("Relational:ColumnName", "function_name");
|
||||
|
||||
var edges = runtimeEntityType.AddProperty(
|
||||
"Edges",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Edges", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Edges>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
valueGenerated: ValueGenerated.OnAdd);
|
||||
edges.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
edges.AddAnnotation("Relational:ColumnName", "edges");
|
||||
edges.AddAnnotation("Relational:ColumnType", "jsonb");
|
||||
edges.AddAnnotation("Relational:DefaultValueSql", "'[]'::jsonb");
|
||||
|
||||
var sinks = runtimeEntityType.AddProperty(
|
||||
"Sinks",
|
||||
typeof(string[]),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Sinks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Sinks>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
sinks.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
sinks.AddAnnotation("Relational:ColumnName", "sinks");
|
||||
|
||||
var constants = runtimeEntityType.AddProperty(
|
||||
"Constants",
|
||||
typeof(string[]),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Constants", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Constants>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
|
||||
constants.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
constants.AddAnnotation("Relational:ColumnName", "constants");
|
||||
|
||||
var taintInvariant = runtimeEntityType.AddProperty(
|
||||
"TaintInvariant",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("TaintInvariant", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<TaintInvariant>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
taintInvariant.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
taintInvariant.AddAnnotation("Relational:ColumnName", "taint_invariant");
|
||||
|
||||
var sourceFile = runtimeEntityType.AddProperty(
|
||||
"SourceFile",
|
||||
typeof(string),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("SourceFile", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<SourceFile>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
sourceFile.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
sourceFile.AddAnnotation("Relational:ColumnName", "source_file");
|
||||
|
||||
var sourceLine = runtimeEntityType.AddProperty(
|
||||
"SourceLine",
|
||||
typeof(int?),
|
||||
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("SourceLine", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<SourceLine>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
|
||||
nullable: true);
|
||||
sourceLine.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
|
||||
sourceLine.AddAnnotation("Relational:ColumnName", "source_line");
|
||||
|
||||
var key = runtimeEntityType.AddKey(
|
||||
new[] { id });
|
||||
runtimeEntityType.SetPrimaryKey(key);
|
||||
key.AddAnnotation("Relational:Name", "targets_pkey");
|
||||
|
||||
var idx_targets_golden_set = runtimeEntityType.AddIndex(
|
||||
new[] { goldenSetId },
|
||||
name: "idx_targets_golden_set");
|
||||
|
||||
var idx_targets_function = runtimeEntityType.AddIndex(
|
||||
new[] { functionName },
|
||||
name: "idx_targets_function");
|
||||
|
||||
return runtimeEntityType;
|
||||
}
|
||||
|
||||
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
|
||||
{
|
||||
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:Schema", "golden_sets");
|
||||
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:TableName", "targets");
|
||||
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
|
||||
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
|
||||
|
||||
Customize(runtimeEntityType);
|
||||
}
|
||||
|
||||
static partial void Customize(RuntimeEntityType runtimeEntityType);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
|
||||
|
||||
/// <summary>
|
||||
/// EF Core DbContext for the GoldenSet module.
|
||||
/// Covers tables in the golden_sets schema.
|
||||
/// </summary>
|
||||
public partial class GoldenSetDbContext : DbContext
|
||||
{
|
||||
private readonly string _schemaName;
|
||||
|
||||
public GoldenSetDbContext(DbContextOptions<GoldenSetDbContext> options, string? schemaName = null)
|
||||
: base(options)
|
||||
{
|
||||
_schemaName = string.IsNullOrWhiteSpace(schemaName)
|
||||
? "golden_sets"
|
||||
: schemaName.Trim();
|
||||
}
|
||||
|
||||
public virtual DbSet<GoldenSetDefinitionEntity> Definitions { get; set; }
|
||||
public virtual DbSet<GoldenSetTargetEntity> Targets { get; set; }
|
||||
public virtual DbSet<GoldenSetAuditLogEntity> AuditLogs { get; set; }
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
var schemaName = _schemaName;
|
||||
|
||||
// =====================================================================
|
||||
// golden_sets.definitions
|
||||
// =====================================================================
|
||||
modelBuilder.Entity<GoldenSetDefinitionEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id).HasName("definitions_pkey");
|
||||
entity.ToTable("definitions", schemaName);
|
||||
|
||||
entity.HasIndex(e => e.Component, "idx_goldensets_component");
|
||||
entity.HasIndex(e => e.Status, "idx_goldensets_status");
|
||||
entity.HasIndex(e => e.ContentDigest, "idx_goldensets_digest").IsUnique();
|
||||
entity.HasIndex(e => e.CreatedAt, "idx_goldensets_created").IsDescending();
|
||||
entity.HasIndex(e => new { e.Component, e.Status }, "idx_goldensets_component_status");
|
||||
|
||||
entity.Property(e => e.Id).HasColumnName("id");
|
||||
entity.Property(e => e.Component).HasColumnName("component");
|
||||
entity.Property(e => e.ContentDigest).HasColumnName("content_digest");
|
||||
entity.Property(e => e.Status).HasColumnName("status");
|
||||
entity.Property(e => e.DefinitionYaml).HasColumnName("definition_yaml");
|
||||
entity.Property(e => e.DefinitionJson).HasColumnType("jsonb").HasColumnName("definition_json");
|
||||
entity.Property(e => e.TargetCount).HasColumnName("target_count");
|
||||
entity.Property(e => e.AuthorId).HasColumnName("author_id");
|
||||
entity.Property(e => e.CreatedAt).HasDefaultValueSql("NOW()").HasColumnName("created_at");
|
||||
entity.Property(e => e.ReviewedBy).HasColumnName("reviewed_by");
|
||||
entity.Property(e => e.ReviewedAt).HasColumnName("reviewed_at");
|
||||
entity.Property(e => e.SourceRef).HasColumnName("source_ref");
|
||||
entity.Property(e => e.Tags).HasColumnName("tags");
|
||||
entity.Property(e => e.SchemaVersion).HasColumnName("schema_version");
|
||||
entity.Property(e => e.UpdatedAt).HasDefaultValueSql("NOW()").HasColumnName("updated_at");
|
||||
});
|
||||
|
||||
// =====================================================================
|
||||
// golden_sets.targets
|
||||
// =====================================================================
|
||||
modelBuilder.Entity<GoldenSetTargetEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id).HasName("targets_pkey");
|
||||
entity.ToTable("targets", schemaName);
|
||||
|
||||
entity.HasIndex(e => e.GoldenSetId, "idx_targets_golden_set");
|
||||
entity.HasIndex(e => e.FunctionName, "idx_targets_function");
|
||||
|
||||
entity.Property(e => e.Id).HasDefaultValueSql("gen_random_uuid()").HasColumnName("id");
|
||||
entity.Property(e => e.GoldenSetId).HasColumnName("golden_set_id");
|
||||
entity.Property(e => e.FunctionName).HasColumnName("function_name");
|
||||
entity.Property(e => e.Edges).HasColumnType("jsonb").HasDefaultValueSql("'[]'::jsonb").HasColumnName("edges");
|
||||
entity.Property(e => e.Sinks).HasColumnName("sinks");
|
||||
entity.Property(e => e.Constants).HasColumnName("constants");
|
||||
entity.Property(e => e.TaintInvariant).HasColumnName("taint_invariant");
|
||||
entity.Property(e => e.SourceFile).HasColumnName("source_file");
|
||||
entity.Property(e => e.SourceLine).HasColumnName("source_line");
|
||||
});
|
||||
|
||||
// =====================================================================
|
||||
// golden_sets.audit_log
|
||||
// =====================================================================
|
||||
modelBuilder.Entity<GoldenSetAuditLogEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id).HasName("audit_log_pkey");
|
||||
entity.ToTable("audit_log", schemaName);
|
||||
|
||||
entity.HasIndex(e => e.GoldenSetId, "idx_audit_golden_set");
|
||||
entity.HasIndex(e => e.Timestamp, "idx_audit_timestamp").IsDescending();
|
||||
entity.HasIndex(e => e.ActorId, "idx_audit_actor");
|
||||
|
||||
entity.Property(e => e.Id).HasDefaultValueSql("gen_random_uuid()").HasColumnName("id");
|
||||
entity.Property(e => e.GoldenSetId).HasColumnName("golden_set_id");
|
||||
entity.Property(e => e.Action).HasColumnName("action");
|
||||
entity.Property(e => e.ActorId).HasColumnName("actor_id");
|
||||
entity.Property(e => e.OldStatus).HasColumnName("old_status");
|
||||
entity.Property(e => e.NewStatus).HasColumnName("new_status");
|
||||
entity.Property(e => e.Details).HasColumnType("jsonb").HasColumnName("details");
|
||||
entity.Property(e => e.Timestamp).HasDefaultValueSql("NOW()").HasColumnName("timestamp");
|
||||
});
|
||||
|
||||
OnModelCreatingPartial(modelBuilder);
|
||||
}
|
||||
|
||||
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Design;
|
||||
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
|
||||
|
||||
/// <summary>
|
||||
/// Design-time factory for EF Core CLI tooling (scaffold, optimize).
|
||||
/// </summary>
|
||||
public sealed class GoldenSetDesignTimeDbContextFactory
|
||||
: IDesignTimeDbContextFactory<GoldenSetDbContext>
|
||||
{
|
||||
private const string DefaultConnectionString =
|
||||
"Host=localhost;Port=55433;Database=postgres;Username=postgres;Password=postgres;Search Path=golden_sets,public";
|
||||
private const string ConnectionStringEnvironmentVariable =
|
||||
"STELLAOPS_GOLDENSET_EF_CONNECTION";
|
||||
|
||||
public GoldenSetDbContext CreateDbContext(string[] args)
|
||||
{
|
||||
var connectionString = ResolveConnectionString();
|
||||
var options = new DbContextOptionsBuilder<GoldenSetDbContext>()
|
||||
.UseNpgsql(connectionString)
|
||||
.Options;
|
||||
|
||||
return new GoldenSetDbContext(options);
|
||||
}
|
||||
|
||||
private static string ResolveConnectionString()
|
||||
{
|
||||
var fromEnvironment = Environment.GetEnvironmentVariable(ConnectionStringEnvironmentVariable);
|
||||
return string.IsNullOrWhiteSpace(fromEnvironment) ? DefaultConnectionString : fromEnvironment;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
/// <summary>
|
||||
/// EF Core entity for golden_sets.audit_log table.
|
||||
/// </summary>
|
||||
public partial class GoldenSetAuditLogEntity
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string GoldenSetId { get; set; } = null!;
|
||||
public string Action { get; set; } = null!;
|
||||
public string ActorId { get; set; } = null!;
|
||||
public string? OldStatus { get; set; }
|
||||
public string? NewStatus { get; set; }
|
||||
public string? Details { get; set; }
|
||||
public DateTime Timestamp { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
/// <summary>
|
||||
/// EF Core entity for golden_sets.definitions table.
|
||||
/// </summary>
|
||||
public partial class GoldenSetDefinitionEntity
|
||||
{
|
||||
public string Id { get; set; } = null!;
|
||||
public string Component { get; set; } = null!;
|
||||
public string ContentDigest { get; set; } = null!;
|
||||
public string Status { get; set; } = null!;
|
||||
public string DefinitionYaml { get; set; } = null!;
|
||||
public string DefinitionJson { get; set; } = null!;
|
||||
public int TargetCount { get; set; }
|
||||
public string AuthorId { get; set; } = null!;
|
||||
public DateTime CreatedAt { get; set; }
|
||||
public string? ReviewedBy { get; set; }
|
||||
public DateTime? ReviewedAt { get; set; }
|
||||
public string SourceRef { get; set; } = null!;
|
||||
public string[] Tags { get; set; } = null!;
|
||||
public string SchemaVersion { get; set; } = null!;
|
||||
public DateTime UpdatedAt { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
|
||||
|
||||
/// <summary>
|
||||
/// EF Core entity for golden_sets.targets table.
|
||||
/// </summary>
|
||||
public partial class GoldenSetTargetEntity
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string GoldenSetId { get; set; } = null!;
|
||||
public string FunctionName { get; set; } = null!;
|
||||
public string Edges { get; set; } = null!;
|
||||
public string[] Sinks { get; set; } = null!;
|
||||
public string[] Constants { get; set; } = null!;
|
||||
public string? TaintInvariant { get; set; }
|
||||
public string? SourceFile { get; set; }
|
||||
public int? SourceLine { get; set; }
|
||||
}
|
||||
@@ -10,6 +10,17 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Migrations\**\*.sql" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- Prevent automatic compiled-model binding so non-default schemas can build runtime models. -->
|
||||
<Compile Remove="EfCore\CompiledModels\GoldenSetDbContextAssemblyAttributes.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
|
||||
@@ -17,6 +28,7 @@
|
||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" />
|
||||
<PackageReference Include="Npgsql" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
|
||||
<PackageReference Include="YamlDotNet" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -7,3 +7,6 @@ Source of truth: `docs/implplan/SPRINT_20260130_002_Tools_csproj_remediation_sol
|
||||
| QA-BINARYINDEX-VERIFY-024 | BLOCKED | SPRINT_20260211_033 run-001: blocked because required module-local AGENTS is missing for `src/BinaryIndex/__Tests/StellaOps.BinaryIndex.GoldenSet.Tests` (repo AGENTS rule 5). |
|
||||
| REMED-05 | TODO | Remediation checklist: docs/implplan/audits/csproj-standards/remediation/checklists/src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.GoldenSet/StellaOps.BinaryIndex.GoldenSet.md. |
|
||||
| REMED-06 | DONE | SOLID review notes captured for SPRINT_20260130_002. |
|
||||
| BINARY-EF-02 | DONE | SPRINT_20260222_090: EF Core model baseline scaffolded (3 entities, golden_sets schema). |
|
||||
| BINARY-EF-04 | DONE | SPRINT_20260222_090: Compiled model (6 files) generated. |
|
||||
| BINARY-EF-05 | DONE | SPRINT_20260222_090: Build/tests validated (261 pass, 0 fail). Module docs updated. |
|
||||
|
||||
Reference in New Issue
Block a user