using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage; using YLErp.BLL; using YLErp.DBModels; namespace YLErp.Modules.SwapModule { /// /// 新建表列名规范测试(2026-08-20 约定:新建表所有数据库列一律小写下划线)。 /// 只构建 EF 模型(纯内存,不连库),断言映射列名不含大写字母: /// client_credit_inout 全表、swap_position.fund_tag、credit.original_credit/max_credit_use_ratio。 /// 基类操作人列(OptId/OptName/OptTime)经 override+[Column] 覆写为小写,此处一并守护。 /// [TestClass] public class DbColumnNamingTest { [TestMethod] public void DB_001_授信出入表_全部列名小写() { using var db = new YLContext(); var entity = db.Model.FindEntityType(typeof(client_credit_inout)); Assert.IsNotNull(entity, "client_credit_inout 未注册到 YLContext"); var table = StoreObjectIdentifier.Table("client_credit_inout", null); foreach (var property in entity.GetProperties()) { var column = property.GetColumnName(table); Assert.IsNotNull(column, $"属性 {property.Name} 未映射列名"); Assert.IsFalse(column.Any(char.IsUpper), $"列名应全小写: {column}(属性 {property.Name})"); } } [TestMethod] public void DB_002_互换持仓与授信表_新增列名小写() { using var db = new YLContext(); AssertColumn(db, typeof(swap_position), nameof(swap_position.FundTag), "fund_tag"); AssertColumn(db, typeof(CreditTable), nameof(CreditTable.OriginalCredit), "original_credit"); AssertColumn(db, typeof(CreditTable), nameof(CreditTable.MaxCreditUseRatio), "max_credit_use_ratio"); } private static void AssertColumn(YLContext db, Type entityType, string propertyName, string expectedColumn) { var entity = db.Model.FindEntityType(entityType); Assert.IsNotNull(entity, $"{entityType.Name} 未注册到 YLContext"); var property = entity.FindProperty(propertyName); Assert.IsNotNull(property, $"属性 {propertyName} 不在 {entityType.Name} 映射中"); var table = StoreObjectIdentifier.Create(entity, StoreObjectType.Table).Value; var column = property.GetColumnName(table); Assert.AreEqual(expectedColumn, column, $"{entityType.Name}.{propertyName} 映射列名不符"); } } }