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 | |
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')
3 files changed, 41 insertions, 12 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs index 9400a7b..53424a4 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -41,7 +41,7 @@ public class CrudService<TEntity> : IDisposable where TEntity : class public List<TEntity> Select(IWhereClause? filter) { - return _table.Select(_dbConnection, filter).Cast<TEntity>().ToList(); + return _table.Select<TEntity>(_dbConnection, null, filter).ToList(); } public bool Exists(IWhereClause? filter) @@ -60,7 +60,7 @@ public class CrudService<TEntity> : IDisposable where TEntity : class return _table.Insert(_dbConnection, insertClause); } - // Return the key. + // Return the key. TODO: Continue here. public object Insert(TEntity entity) { return _table.Insert(_dbConnection, ); diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md index c30ea90..589b0a8 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md @@ -1,5 +1,9 @@ # CRUD Technic Notes +## Overview + +The ultimate CRUD scaffold finally comes. + ## Database Pipeline ### Select @@ -10,8 +14,6 @@ 4. Run hook `AfterSelect` for every column. 5. Convert `dynamic`s to `TEntity`s. -TODO: Continue here. - ### Insert 1. Create insert clause consisting of insert items. 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)); } |