public static MappedDynamicParameters GetParameters <TEntity>( this DbContext context, TEntity entity ) { var entityType = context.Model.FindEntityType(typeof(TEntity)); if (entityType == null) { throw new InvalidOperationException($"Entity of type {typeof(TEntity).FullName} is not registered in DbContext. Use overload with table name and schema"); } var parameters = new MappedDynamicParameters(); foreach (var p in entityType.GetProperties()) { var typeMapping = p.FindRelationalMapping(); var valueConverter = p.GetValueConverter() ?? typeMapping.Converter; var columnName = p.GetColumnName(); parameters.PropertyToColumnMapping.Add(p.Name, columnName); parameters.ColumnToParameterMapping.Add(columnName, columnName); if (p.IsShadowProperty()) { var generator = p.GetValueGeneratorFactory().Invoke(p, entityType); // this only supports simple generators, where passed entity is not used! var val = generator.Next(null); parameters.Add( columnName, valueConverter != null ? valueConverter.ConvertToProvider(val) : val, typeMapping.DbType, size: typeMapping.Size ); continue; } parameters.Add( columnName, valueConverter != null ? valueConverter.ConvertToProvider(p.GetGetter().GetClrValue(entity)) : p .GetGetter() .GetClrValue(entity), typeMapping.DbType, size: typeMapping.Size ); } return(parameters); }
public static async Task InsertAsync <TEntity>(this DapperHybridContext context, string schema, string table, TEntity entity) { var connection = context.Database.GetDbConnection(); var parameters = new MappedDynamicParameters(entity); var statement = context.CreateSqlGenerator <TEntity>().Insert(schema, table, parameters.ColumnToParameterMapping); await connection.ExecuteAsync( statement.Statement, parameters, transaction : context.Database.CurrentTransaction?.GetDbTransaction() ) .ConfigureAwait(false); }