public DapperRepository(DapperContext dapperContext, ILoggerFactory loggerFactory = null) { Guard.ArgumentNotNull(dapperContext, nameof(dapperContext)); Context = dapperContext; _metadata = dapperContext.Runtime.GetMetadata(typeof(T)); this.EntityType = typeof(T); _logger = new Lazy <ILogger>(() => loggerFactory?.CreateLogger <DapperRepository <T> >() ?? (ILogger)NullLogger.Instance); }
/// <summary> /// 获取指定类型对应的数据源。 /// </summary> public DapperDataSource GetDataSource(Type entityType, bool throwIfNotFound = true) { return(this._mappedDataSources.GetOrAdd(entityType, et => { DapperMetadata metadata = this.GetMetadata(et, throwIfNotFound); return NewDataSource(metadata?.DbReadingConnectionName, metadata?.DbWritingConnectionName); })); }
/// <summary> /// 根据实体类型获取 Dapper 配置的元数据。 /// </summary> /// <param name="entityType">实体类型。</param> /// <param name="throwIfNotFound">未发现元数据时是否抛异常</param> /// <returns></returns> public DapperMetadata GetMetadata(Type entityType, bool throwIfNotFound = true) { if (_metadataSet.TryGetValue(entityType, out DapperMetadata value)) { return(value); } var convention = _options.Value.GetConvention(); var item = convention.TypeConventions.FirstOrDefault(x => x.Filter(entityType) && x.Mapped); if (item == null && throwIfNotFound) { throw new InvalidOperationException( $"找不到类型 {entityType.Name} 的元数据提供程序, 请确保已经通过 {typeof(DapperMetadataProvider<>).Name} 或者{typeof(TypeConvention).Name}实现了元数据提供程序。"); } value = new DapperMetadata(entityType, item, convention); _metadataSet.TryAdd(entityType, value); return(value); }
private static string GenerateSelectSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { string columnsSetSeg = metadata.Fields.Where(f => !f.Ignore).OrderBy(x => x.Field.Name).Select(k => runtime.DelimitIdentifier(entityType, k.Name)).ToArrayString(", "); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("SELECT "); sqlBuilder.Append(columnsSetSeg); sqlBuilder.Append($" FROM "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)}"); return(sqlBuilder.ToString()); }
private static string GenerateDeleteSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { string whereSeg = KeyDelimitSegment(entityType, runtime, metadata); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("DELETE FROM "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)} "); if (!string.IsNullOrWhiteSpace(whereSeg)) { sqlBuilder.Append($" WHERE "); sqlBuilder.Append(whereSeg); } return(sqlBuilder.ToString()); }
private static string GenerateUpdateSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { var fields = metadata.Fields.Where(f => !f.IsKey && !f.AutoGeneration && !f.Ignore).OrderBy(x => x.Field.Name).ToArray(); string columnsSetSeg = fields.Select(k => $"{runtime.DelimitIdentifier(entityType, k.Name)} = {runtime.DelimitParameter(entityType,k.Field.Name)}").ToArrayString(", "); string whereSeg = KeyDelimitSegment(entityType, runtime, metadata); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("UPDATE "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)} "); sqlBuilder.Append($"SET "); sqlBuilder.Append(columnsSetSeg); if (!string.IsNullOrWhiteSpace(whereSeg)) { sqlBuilder.Append($" WHERE "); sqlBuilder.Append(whereSeg); } return(sqlBuilder.ToString()); }
private static string GenerateInsertSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { var fields = metadata.Fields.Where(f => f.Ignore == false && f.AutoGeneration == false).OrderBy(x => x.Field.Name).ToArray(); string columns = fields.Select(k => runtime.DelimitIdentifier(entityType, k.Name)).ToArrayString(", "); string parameters = fields.Select(k => $"{runtime.DelimitParameter(entityType, k.Field.Name)}").ToArrayString(", "); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("INSERT INTO "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)} "); sqlBuilder.Append($"({columns}) "); sqlBuilder.Append(" VALUES "); sqlBuilder.Append($"({parameters})"); return(sqlBuilder.ToString()); }
private static string KeyDelimitSegment(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { return(metadata.Fields.Where(f => f.IsKey).Select(k => $"{runtime.DelimitIdentifier(entityType, k.Name)} = {runtime.DelimitParameter(entityType, k.Field.Name)}").ToArrayString(" AND ")); }
public DapperMetadataBuilder() { _mapping = new DapperMetadata(typeof(T)); }