예제 #1
0
 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);
 }
예제 #2
0
 /// <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);
     }));
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
        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());
        }
예제 #5
0
        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());
        }
예제 #6
0
        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());
        }
예제 #7
0
        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());
        }
예제 #8
0
 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 "));
 }
예제 #9
0
 public DapperMetadataBuilder()
 {
     _mapping = new DapperMetadata(typeof(T));
 }