public static async Task BulkInsertWithIdGeneration <T>(this IContextAdapter contextAdapter, IList <T> forSave) where T : class { if (forSave == null) { return; } var pk = contextAdapter.GetPk <T>(); if (!pk.IsIdentity) { await contextAdapter.BulkInsert(forSave, true); } else { var isNew = ExpressHelper.IsPropertyEmpty <T>(pk.PropertyName, pk.Type).Compile(); var newObjects = forSave.Where(isNew).ToArray(); if (!newObjects.Any()) { return; } await contextAdapter.RetrieveIds(newObjects); await contextAdapter.BulkInsert(newObjects, true); } }
private Action <TSource, TDestination> GetCopyPk(IContextAdapter contextAdapter) { var expression = ExpressHelper.CreateCopy <TSource, TDestination>( contextAdapter.GetPk <TSource>().PropertyName, contextAdapter.GetForwardKeyProperty <TDestination>(_propertyName, typeof(TSource))); return(expression.Compile()); }
private Action <TSource, TSource> GetCopyPk(IContextAdapter contextAdapter) { var path = ExpressHelper.GetPath(_extractor); var propertyName = contextAdapter.GetBackwardKeyProperty <TSource>(path); var expression = ExpressHelper.CreateCopy <TSource, TSource>( $"{path}.{contextAdapter.GetPk<TSource>().PropertyName}", propertyName); return(expression.Compile()); }
public async Task RetrieveIdsLong <TEntity>(IContextAdapter context, TEntity[] entities) { var tableName = context.GetTableName <TEntity>(); var entitiesLength = entities.Length; var minId = Minus(await context.RunScalar <TValue>(RetrieveIdsSql(tableName, entitiesLength)), entitiesLength); var pkSetter = ExpressHelper.GetPropSetter <TEntity, TValue>(context.GetPk <TEntity>().PropertyName).Compile(); var id = minId; foreach (var entity in entities) { id = AddOne(id); pkSetter(entity, id); } }
public static async Task RetrieveIds <TEntity>(this IContextAdapter contextAdapter, TEntity[] entities) where TEntity : class { await Worker[contextAdapter.GetPk <TEntity>().Type].RetrieveIdsLong(contextAdapter, entities); }