Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit cd98666

Browse files
committed
Support [AutoId] Guid on InsertAsync/SaveAsync
1 parent 574ff56 commit cd98666

File tree

2 files changed

+32
-17
lines changed

2 files changed

+32
-17
lines changed

src/ServiceStack.OrmLite/Async/OrmLiteWriteCommandExtensionsAsync.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ internal static Task<int> DeleteAsync(this IDbCommand dbCmd, Type tableType, str
266266
return dbCmd.ExecuteSqlAsync(dbCmd.GetDialectProvider().ToDeleteStatement(tableType, sql), token);
267267
}
268268

269-
internal static Task<long> InsertAsync<T>(this IDbCommand dbCmd, T obj, Action<IDbCommand> commandFilter, bool selectIdentity, CancellationToken token)
269+
internal static async Task<long> InsertAsync<T>(this IDbCommand dbCmd, T obj, Action<IDbCommand> commandFilter, bool selectIdentity, CancellationToken token)
270270
{
271271
OrmLiteConfig.InsertFilter?.Invoke(dbCmd, obj);
272272

@@ -278,11 +278,20 @@ internal static Task<long> InsertAsync<T>(this IDbCommand dbCmd, T obj, Action<I
278278
dialectProvider.SetParameterValues<T>(dbCmd, obj);
279279

280280
commandFilter?.Invoke(dbCmd);
281+
282+
if (dialectProvider.HasInsertReturnValues(ModelDefinition<T>.Definition))
283+
{
284+
using (var reader = await dbCmd.ExecReaderAsync(dbCmd.CommandText, token))
285+
using (reader)
286+
{
287+
return reader.PopulateReturnValues(dialectProvider, obj);
288+
}
289+
}
281290

282291
if (selectIdentity)
283-
return dialectProvider.InsertAndGetLastInsertIdAsync<T>(dbCmd, token);
292+
return await dialectProvider.InsertAndGetLastInsertIdAsync<T>(dbCmd, token);
284293

285-
return dbCmd.ExecNonQueryAsync(token).Then(i => (long)i);
294+
return await dbCmd.ExecNonQueryAsync(token).Then(i => (long)i);
286295
}
287296

288297
internal static Task InsertAsync<T>(this IDbCommand dbCmd, Action<IDbCommand> commandFilter, CancellationToken token, params T[] objs)

src/ServiceStack.OrmLite/OrmLiteWriteCommandExtensions.cs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -647,24 +647,12 @@ internal static long Insert<T>(this IDbCommand dbCmd, T obj, Action<IDbCommand>
647647

648648
commandFilter?.Invoke(dbCmd); //dbCmd.OnConflictInsert() needs to be applied before last insert id
649649

650-
var modelDef = typeof(T).GetModelDefinition();
651-
if (dialectProvider.HasInsertReturnValues(modelDef))
650+
if (dialectProvider.HasInsertReturnValues(ModelDefinition<T>.Definition))
652651
{
653652
using (var reader = dbCmd.ExecReader(dbCmd.CommandText))
654653
using (reader)
655654
{
656-
if (reader.Read())
657-
{
658-
var values = new object[reader.FieldCount];
659-
var indexCache = reader.GetIndexFieldsCache(ModelDefinition<T>.Definition, dialectProvider);
660-
obj.PopulateWithSqlReader(dialectProvider, reader, indexCache, values);
661-
if ((modelDef.PrimaryKey != null) && modelDef.PrimaryKey.AutoIncrement)
662-
{
663-
var id = modelDef.GetPrimaryKey(obj);
664-
return Convert.ToInt64(id);
665-
}
666-
}
667-
return 0;
655+
return reader.PopulateReturnValues(dialectProvider, obj);
668656
}
669657
}
670658

@@ -678,6 +666,24 @@ internal static long Insert<T>(this IDbCommand dbCmd, T obj, Action<IDbCommand>
678666
return dbCmd.ExecNonQuery();
679667
}
680668

669+
internal static long PopulateReturnValues<T>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, T obj)
670+
{
671+
if (reader.Read())
672+
{
673+
var modelDef = ModelDefinition<T>.Definition;
674+
var values = new object[reader.FieldCount];
675+
var indexCache = reader.GetIndexFieldsCache(modelDef, dialectProvider);
676+
obj.PopulateWithSqlReader(dialectProvider, reader, indexCache, values);
677+
if ((modelDef.PrimaryKey != null) && modelDef.PrimaryKey.AutoIncrement)
678+
{
679+
var id = modelDef.GetPrimaryKey(obj);
680+
return Convert.ToInt64(id);
681+
}
682+
}
683+
684+
return 0;
685+
}
686+
681687
internal static void Insert<T>(this IDbCommand dbCmd, Action<IDbCommand> commandFilter, params T[] objs)
682688
{
683689
dbCmd.InsertAll(objs: objs, commandFilter: commandFilter);

0 commit comments

Comments
 (0)