diff options
author | crupest <crupest@outlook.com> | 2022-12-12 16:21:44 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:53 +0800 |
commit | 48742e28c612b9c1b2b1435cdd32152f61041645 (patch) | |
tree | e474fb98d41de5b48b2e9b11cc2909dda2fc9b6a /docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs | |
parent | 24d42e5eb284267966aee8bb687710bfcbc1a255 (diff) | |
download | crupest-48742e28c612b9c1b2b1435cdd32152f61041645.tar.gz crupest-48742e28c612b9c1b2b1435cdd32152f61041645.tar.bz2 crupest-48742e28c612b9c1b2b1435cdd32152f61041645.zip |
Develop secret api. v30
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs')
-rw-r--r-- | docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 089ff8a..64ea505 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -284,6 +284,25 @@ CREATE TABLE {tableName}( return (result.ToString(), parameters); } + public void CheckInsertClause(IInsertClause insertClause) + { + var columnNameSet = new HashSet<string>(ColumnInfos.Select(c => c.ColumnName)); + + foreach (var item in insertClause.Items) + { + columnNameSet.Remove(item.ColumnName); + } + + foreach (var columnName in columnNameSet) + { + var column = GetColumn(columnName); + if (!column.IsAutoIncrement) + { + throw new Exception($"Column {columnName} is not specified and is not auto increment."); + } + } + } + /// <summary> /// If you call this manually, it's your duty to call hooks. /// </summary> @@ -291,6 +310,7 @@ CREATE TABLE {tableName}( public (string sql, ParamList parameters) GenerateInsertSql(IInsertClause insertClause, string? dbProviderId = null) { CheckRelatedColumns(insertClause); + CheckInsertClause(insertClause); var parameters = new ParamList(); @@ -463,7 +483,6 @@ CREATE TABLE {tableName}( return queryResult.Select(MapDynamicTo<TResult>).ToList(); } - // TODO: Continue here. /// <summary> /// Insert a entity and call hooks. /// </summary> @@ -473,7 +492,7 @@ CREATE TABLE {tableName}( object? key = null; foreach (var column in ColumnInfos) { - InsertItem? item = insert.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName); + InsertItem? item = insert.Items.SingleOrDefault(i => i.ColumnName == column.ColumnName); object? value = null; if (item is null) { @@ -505,21 +524,29 @@ CREATE TABLE {tableName}( /// <returns>The key of insert entity.</returns> public virtual int Update(IDbConnection dbConnection, IWhereClause? where, IUpdateClause update) { - var (sql, parameters) = GenerateUpdateSql(where, update); - - var readUpdateClause = UpdateClause.Create(); + var realUpdate = UpdateClause.Create(); foreach (var column in ColumnInfos) { UpdateItem? item = update.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName); - var value = item?.Value; - column.Hooks.BeforeUpdate(column, ref value, item is null ? false : true); + + object? value = item?.Value; + column.Hooks.BeforeUpdate(column, ref value, false); + if (value is not null) { - readUpdateClause.Add(column.ColumnName, value); + if (value is DbNullValue) + { + realUpdate.Add(column.ColumnName, null); + } + else + { + realUpdate.Add(column.ColumnName, value); + } } } + var (sql, parameters) = GenerateUpdateSql(where, realUpdate); return dbConnection.Execute(sql, ConvertParameters(parameters)); } |