예제 #1
0
        /// <summary>
        /// 配置模型属性对应的字段名
        /// </summary>
        /// <typeparam name="T">模型类型</typeparam>
        /// <param name="property">模型属性的表达式</param>
        /// <param name="columnName">模型属性对应的字段名称</param>
        public static void HasColumnName <T>(Expression <Func <T, object> > property, string columnName)
        {
            var member = property?.GetMember();

            if (member?.IsPropertyOrField() != true)
            {
                throw Error.ArgumentException("指定的表达式不是属性或字段。", nameof(property));
            }
            if (columnName.IsNullOrWhiteSpace())
            {
                throw Error.ArgumentNullException(nameof(columnName));
            }

            var m = new ColumnMeta(member, typeof(T));

            //if (CachedIgnoreColumns.Contains(m))
            //{
            //    throw Error.Exception($"属性 {m} 已经被忽略,不能设置列名。");
            //}
            lock (CachedColumnNames)
            {
                if (CachedColumnNames.ContainsKey(m))
                {
                    throw Error.Exception($"已经设置了字段 {m} 对应的列名称为 {CachedColumnNames[m]},不能重复设置。");
                }
                CachedColumnNames.Add(m, columnName);
            }
        }
예제 #2
0
        /// <summary>
        /// 忽略成员
        /// </summary>
        /// <typeparam name="T">模型类型</typeparam>
        /// <param name="property">要忽略的模型属性的表达式</param>
        public static void IgnoreColumn <T>(Expression <Func <T, object> > property)
        {
            var member = property?.GetMember();

            if (member?.IsPropertyOrField() != true)
            {
                throw Error.ArgumentException("指定的表达式不是属性或字段。", nameof(property));
            }

            lock (CachedIgnoreColumns)
            {
                var keys = GetKeyMetas <T>();
                var m    = new ColumnMeta(member, typeof(T));
                if (keys != null && keys.Any(x => x.Member == member))
                {
                    throw Error.Exception($"属性 {m} 已经配置为主键,不能忽略。");
                }

                //if (CachedColumnNames.ContainsKey(m))
                //{
                //    throw Error.ArgumentException("属性已经配置字段名:" + CachedColumnNames[m] + "。", nameof(property));
                //}
                if (!CachedIgnoreColumns.Contains(m))
                {
                    CachedIgnoreColumns.Add(m);
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 配置模型的自增主键
        /// </summary>
        /// <typeparam name="T">模型类型</typeparam>
        /// <param name="property">模型自增列属性的表达式</param>
        /// <param name="columnName">自增主键列对应的字段名称</param>
        public static void HasIdentity <T>(Expression <Func <T, object> > property, string columnName = null)
        {
            var member = property?.GetMember();

            if (member?.IsPropertyOrField() != true)
            {
                throw Error.ArgumentException("指定的表达式不是属性或字段。", nameof(property));
            }

            lock (CachedTableIdentities)
            {
                var m    = new ColumnMeta(member, typeof(T));
                var type = typeof(T);
                if (CachedTableIdentities.ContainsKey(type))
                {
                    throw Error.Exception(
                              $"已经设置了类型 {type.FullName} 对应的自增列为 {CachedTableIdentities[type].ColumnName},不能重复设置。");
                }

                CachedTableIdentities.Add(type, m);
                if (!string.IsNullOrWhiteSpace(columnName))
                {
                    HasColumnName(property, columnName);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// 返回模型对应的字段名
        /// </summary>
        /// <param name="member">模型的成员信息</param>
        /// <param name="type">模型类型</param>
        /// <returns>成员对应的列名称</returns>
        public static string GetColumnName(MemberInfo member, Type type)
        {
            if (member?.IsPropertyOrField() != true)
            {
                throw Error.ArgumentException("指定的表达式不是属性或字段。", nameof(member));
            }
            var m = new ColumnMeta(member, type);

            return(GetColumnName(m));
        }
예제 #5
0
        /// <summary>
        /// 判断某字段是否被忽略
        /// </summary>
        /// <param name="memberInfo">属性或字段成员信息</param>
        /// <param name="type">模型类型</param>
        /// <returns>返回该字段是否忽略映射</returns>
        public static bool IsIgnore(MemberInfo memberInfo, Type type)
        {
            if (memberInfo == null)
            {
                throw Error.ArgumentNullException(nameof(memberInfo));
            }

            lock (CachedIgnoreColumns)
            {
                var m = new ColumnMeta(memberInfo, type);
                return(CachedIgnoreColumns.Contains(m));
            }
        }
예제 #6
0
        internal static string GetColumnName(ColumnMeta columnMeta)
        {
            if (columnMeta == null)
            {
                throw Error.ArgumentNullException(nameof(columnMeta));
            }

            lock (CachedColumnNames)
            {
                if (CachedColumnNames.ContainsKey(columnMeta))
                {
                    return(CachedColumnNames[columnMeta]);
                }

                return(columnMeta.Name);
            }
        }
예제 #7
0
        /// <summary>
        /// 配置模型的唯一主键列名
        /// </summary>
        /// <typeparam name="T">模型类型</typeparam>
        /// <param name="properties">模型主键属性的表达式</param>
        public static void HasKey <T>(params Expression <Func <T, object> >[] properties)
        {
            if (properties.IsNullOrEmpty())
            {
                throw Error.ArgumentNullException(nameof(properties));
            }

            var members = properties.Select(x => x.GetMember()).Distinct().ToArray();

            if (members.Any(x => !x.IsPropertyOrField()))
            {
                throw Error.ArgumentException("参数中包含不是属性或字段的表达式。", nameof(properties));
            }

            lock (CachedTableKeys)
            {
                var type = typeof(T);
                if (CachedTableKeys.ContainsKey(type))
                {
                    var keys = string.Join(",", GetKey <T>());
                    throw Error.Exception($"已经设置了类型 {type.FullName} 对应的主键为 {keys},不能重复设置。");
                    //CachedTableKeys[type] = key;
                }

                var metas = new ColumnMeta[members.Length];
                for (var index = 0; index < members.Length; index++)
                {
                    var member = members[index];
                    var m      = new ColumnMeta(member, type);
                    if (CachedIgnoreColumns.Contains(m))
                    {
                        throw Error.Exception($"属性 {m} 已经被忽略,不能设置为主键。");
                    }

                    metas[index] = m;
                }

                CachedTableKeys.Add(type, metas);
            }
        }