예제 #1
0
 /// <summary>
 /// 获取指定类型对应的数据源。
 /// </summary>
 /// <param name="entityType">实体类型。</param>
 /// <param name="throwIfNotFound">未发现元数据时是否抛异常。</param>
 public DapperDataSource GetDataSource(Type entityType, bool throwIfNotFound = true)
 {
     return(_mappedDataSources.GetOrAdd(entityType, et =>
     {
         DapperMetadata metadata = GetMetadata(et, throwIfNotFound);
         return GetDataSource(metadata?.ReadingConnectionName, metadata?.WritingConnectionName);
     }));
 }
예제 #2
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dapperContext">dapper上下文</param>
        /// <param name="loggerFactory">日志组件</param>
        public DapperRepository(DapperContext dapperContext, ILoggerFactory loggerFactory = null)
        {
            Guard.ArgumentNotNull(dapperContext, nameof(dapperContext));

            Context     = dapperContext;
            _metadata   = dapperContext.Runtime.GetMetadata(typeof(T));
            _loggerLazy = new Lazy <ILogger>(() => loggerFactory?.CreateLogger <DapperRepository <T> >() ?? NullLogger <DapperRepository <T> > .Instance);
        }
예제 #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.GetModelConvention();
            var item       = convention.TypeConventions.FirstOrDefault(x => x.Filter(entityType));

            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
        /// <summary>
        /// 生成插入的SQL语句
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <param name="runtime">Dapper运行时</param>
        /// <param name="metadata">Dapper元数据</param>
        /// <returns></returns>
        private static string GenerateInsertSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata)
        {
            var    fields  = metadata.Fields.Where(f => !f.Ignore && !f.AutoGeneration).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());
        }
예제 #5
0
 /// <summary>
 /// 使用界定符包围T-SQL中的参数字符串。
 /// </summary>
 /// <param name="entityType">实体类型</param>
 /// <param name="runtime">Dapper运行时</param>
 /// <param name="metadata">Dapper元数据</param>
 /// <returns></returns>
 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 "));
 }
예제 #6
0
        /// <summary>
        /// 生成查询的SQL语句
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <param name="runtime">Dapper运行时</param>
        /// <param name="metadata">Dapper元数据</param>
        /// <returns></returns>
        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());
        }
예제 #7
0
        /// <summary>
        /// 生成删除的SQL语句
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <param name="runtime">Dapper运行时</param>
        /// <param name="metadata">Dapper元数据</param>
        /// <returns></returns>
        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());
        }
예제 #8
0
        /// <summary>
        /// 生成更新的SQL语句
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <param name="runtime">Dapper运行时</param>
        /// <param name="metadata">Dapper元数据</param>
        /// <returns></returns>
        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());
        }