diff options
5 files changed, 36 insertions, 26 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs index 800594d..4a594bb 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs @@ -6,10 +6,7 @@ namespace CrupestApi.Commons.Crud; public class ColumnHooks { - /// <summary> - /// If value is null, then it might because the column does not designated a value or it is designated null. - /// </summary> - public delegate void ColumnHookAction(ColumnInfo column, ref object? value); + public delegate void ColumnHookAction(ColumnInfo column, ref object? value, bool specified); public ColumnHooks(ColumnHookAction afterSelect, ColumnHookAction beforeInsert, ColumnHookAction beforeUpdate) { @@ -133,18 +130,18 @@ public class ColumnInfo private void TryCoerceStringFromNullToEmpty(ref object? value) { - if (ColumnType.ClrType == typeof(string) && (Metadata.GetValueOrDefault<bool?>(ColumnMetadataKeys.DefaultEmptyForString) ?? false) && value is null) + if (ColumnType.ClrType == typeof(string) && (Metadata.GetValueOrDefault<bool?>(ColumnMetadataKeys.DefaultEmptyForString) is true) && (value is null || value is DbNullValue)) { value = ""; } } - protected void OnAfterSelect(ColumnInfo column, ref object? value) + protected void OnAfterSelect(ColumnInfo column, ref object? value, bool specified) { TryCoerceStringFromNullToEmpty(ref value); } - protected void OnBeforeInsert(ColumnInfo column, ref object? value) + protected void OnBeforeInsert(ColumnInfo column, ref object? value, bool specified) { if (column.IsClientGenerate && value is not null) { @@ -156,18 +153,13 @@ public class ColumnInfo OnBeforeSet(column, ref value); } - protected void OnBeforeUpdate(ColumnInfo column, ref object? value) + protected void OnBeforeUpdate(ColumnInfo column, ref object? value, bool specified) { if (column.IsNoUpdate) { throw new UserException($"'{column.ColumnName}' is not updatable."); } - if ((column.UpdateBehavior & UpdateBehavior.NullIsSetNull) != 0 && value is null) - { - value = DbNullValue.Instance; - } - OnBeforeSet(column, ref value); } @@ -175,7 +167,7 @@ public class ColumnInfo { TryCoerceStringFromNullToEmpty(ref value); - if (value is null && column.IsNotNull) + if ((value is null || value is DbNullValue) && column.IsNotNull) { throw new UserException($"{column.ColumnName} can't be null."); } diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs index 7f248cf..7645b09 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs @@ -1,10 +1,12 @@ using System.Text; -using Dapper; namespace CrupestApi.Commons.Crud; public class InsertItem { + /// <summary> + /// Null means use default value. Use <see cref="DbNullValue"/>. + /// </summary> public InsertItem(string columnName, object? value) { ColumnName = columnName; @@ -54,7 +56,7 @@ public class InsertClause : IInsertClause public string GenerateColumnListSql(string? dbProviderId = null) { - return string.Join(", ", Items.Select(i => i.ColumnName)); + return string.Join(", ", Items.Where(i => i.Value is not null).Select(i => i.ColumnName)); } public (string sql, ParamList parameters) GenerateValueListSql(string? dbProviderId = null) @@ -64,6 +66,7 @@ public class InsertClause : IInsertClause for (var i = 0; i < Items.Count; i++) { var item = Items[i]; + if (item.Value is null) continue; var parameterName = parameters.AddRandomNameParameter(item.Value, item.ColumnName); sb.Append($"@{parameterName}"); if (i != Items.Count - 1) diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs index a1aaa45..0a43c67 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs @@ -1,5 +1,3 @@ -using Dapper; - namespace CrupestApi.Commons.Crud; public class OrderByItem diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs index 4b253b7..fe8d2a0 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs @@ -3,6 +3,9 @@ using System.Diagnostics; namespace CrupestApi.Commons.Crud; +/// <summary> +/// Null value will be thrown. Please use <see cref="DbNullValue.Instance"/>. +/// </summary> public record ParamInfo(string Name, object? Value, string? ColumnName = null); public class ParamList : List<ParamInfo> diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 93d02fd..d2f48c6 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -1,5 +1,4 @@ using System.Data; -using System.Diagnostics; using System.Reflection; using System.Text; using Dapper; @@ -368,7 +367,12 @@ CREATE TABLE {tableName}( var result = new DynamicParameters(); foreach (var param in parameters) { - if (param.Value is null || param.Value is DbNullValue) + if (param.Value is null) + { + continue; + } + + if (param.Value is DbNullValue) { result.Add(param.Name, null); continue; @@ -418,10 +422,17 @@ CREATE TABLE {tableName}( { object? value = null; var dynamicProperty = dynamicType.GetProperty(column.ColumnName); - if (dynamicProperty is not null) value = dynamicProperty.GetValue(d); - if (value is not null) - value = column.ColumnType.ConvertFromDatabase(value); - column.Hooks.AfterSelect(column, ref value); + if (dynamicProperty is null) + { + column.Hooks.AfterSelect(column, ref value, false); + } + else + { + value = dynamicProperty.GetValue(d); + if (value is not null) + value = column.ColumnType.ConvertFromDatabase(value); + column.Hooks.AfterSelect(column, ref value, true); + } var propertyInfo = column.PropertyInfo; if (propertyInfo is not null) { @@ -443,8 +454,11 @@ CREATE TABLE {tableName}( foreach (var column in ColumnInfos) { InsertItem? item = insert.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName); - var value = item?.Value; - column.Hooks.BeforeInsert(column, ref value); + object? value = null; + if (item is null || item.Value is null) + { + column.Hooks.BeforeInsert(column, , ); + } if (item is null) { item = new InsertItem(column.ColumnName, value); |