aboutsummaryrefslogtreecommitdiff
path: root/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
diff options
context:
space:
mode:
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs')
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs55
1 files changed, 44 insertions, 11 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
index 5bb19ad..498529c 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
@@ -27,8 +27,9 @@ public class TableInfo
var columnInfos = new List<ColumnInfo>();
- bool hasPrimaryKey = false;
bool hasId = false;
+ ColumnInfo? primaryKeyColumn = null;
+ ColumnInfo? keyColumn = null;
List<PropertyInfo> columnProperties = new();
List<PropertyInfo> nonColumnProperties = new();
@@ -40,11 +41,21 @@ public class TableInfo
var columnInfo = new ColumnInfo(this, property, _columnTypeProvider);
columnInfos.Add(columnInfo);
if (columnInfo.IsPrimaryKey)
- hasPrimaryKey = true;
+ {
+ primaryKeyColumn = columnInfo;
+ }
if (columnInfo.ColumnName.Equals("id", StringComparison.OrdinalIgnoreCase))
{
hasId = true;
}
+ if (columnInfo.IsSpecifiedAsKey)
+ {
+ if (keyColumn is not null)
+ {
+ throw new Exception("Already exists a key column.");
+ }
+ keyColumn = columnInfo;
+ }
columnProperties.Add(property);
}
else
@@ -53,14 +64,21 @@ public class TableInfo
}
}
- if (!hasPrimaryKey)
+ if (primaryKeyColumn is null)
{
if (hasId) throw new Exception("A column named id already exists but is not primary key.");
- var columnInfo = CreateAutoIdColumn();
- columnInfos.Add(columnInfo);
+ primaryKeyColumn = CreateAutoIdColumn();
+ columnInfos.Add(primaryKeyColumn);
+ }
+
+ if (keyColumn is null)
+ {
+ keyColumn = primaryKeyColumn;
}
ColumnInfos = columnInfos;
+ PrimaryKeyColumn = primaryKeyColumn;
+ KeyColumn = keyColumn;
ColumnProperties = columnProperties;
NonColumnProperties = nonColumnProperties;
@@ -85,6 +103,12 @@ public class TableInfo
public Type EntityType { get; }
public string TableName { get; }
public IReadOnlyList<ColumnInfo> ColumnInfos { get; }
+ public ColumnInfo PrimaryKeyColumn { get; }
+ /// <summary>
+ /// Maybe not the primary key. But acts as primary key.
+ /// </summary>
+ /// <seealso cref="ColumnMetadataKeys.ActAsKey"/>
+ public ColumnInfo KeyColumn { get; }
public IReadOnlyList<PropertyInfo> ColumnProperties { get; }
public IReadOnlyList<PropertyInfo> NonColumnProperties { get; }
public IReadOnlyList<string> ColumnNameList => _lazyColumnNameList.Value;
@@ -412,10 +436,10 @@ CREATE TABLE {tableName}(
});
}
- public virtual int Insert(IDbConnection dbConnection, IInsertClause insert)
+ // Returns the insert entity's key.
+ public object Insert(IDbConnection dbConnection, IInsertClause insert)
{
- var (sql, parameters) = GenerateInsertSql(insert);
-
+ object? key = null;
foreach (var column in ColumnInfos)
{
InsertItem? item = insert.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName);
@@ -423,16 +447,25 @@ CREATE TABLE {tableName}(
column.Hooks.BeforeInsert(column, ref value);
if (item is null)
{
- if (value is not null)
- insert.Items.Add(new InsertItem(column.ColumnName, value));
+ item = new InsertItem(column.ColumnName, value);
+ insert.Items.Add(item);
}
else
{
item.Value = value;
}
+
+ if (item.ColumnName == KeyColumn.ColumnName)
+ {
+ key = item.Value;
+ }
}
- return dbConnection.Execute(sql, ConvertParameters(parameters));
+ var (sql, parameters) = GenerateInsertSql(insert);
+
+ dbConnection.Execute(sql, ConvertParameters(parameters));
+
+ return key ?? throw new Exception("No key???");
}
public virtual int Update(IDbConnection dbConnection, IWhereClause? where, IUpdateClause update)