internal ClassJoinDefine(ClassDefineMetadata metadata, ClassJoinType joinType, MemberInfo member, Action <TEntity, HasManyByForeignKeyDefine> foreignKeyDefine)
            : this(metadata, joinType, member)
        {
            switch (joinType)
            {
            case ClassJoinType.HasManyByForeignKey:
                joinMetadata.DataProcesser = new HasManyByForeignKeyClassJoinProcessor <TEntity, TJoin>(foreignKeyDefine, joinMetadata);
                break;

            default:
                throw new NotSupportedException();
            }
        }
        internal ClassJoinDefine(ClassDefineMetadata metadata, ClassJoinType joinType, MemberInfo member, Func <TEntity, ISpecification <TJoin>, ISpecification <TJoin> > joinExpr)
            : this(metadata, joinType, member)
        {
            switch (joinType)
            {
            case ClassJoinType.HasOne:
                joinMetadata.DataProcesser = new HasOneClassJoinProcessor <TEntity, TJoin>(joinExpr, joinMetadata);
                break;

            case ClassJoinType.HasMany:
                joinMetadata.DataProcesser = new HasManyClassJoinProcessor <TEntity, TJoin>(joinExpr, joinMetadata);
                break;

            default:
                throw new NotSupportedException();
            }
        }
        private ClassJoinDefine(ClassDefineMetadata metadata, ClassJoinType joinType, MemberInfo member)
        {
            this.metadata = metadata;
            this.joinType = joinType;
            this.member   = member;

            joinMetadata          = new ClassJoinDefineMetadata();
            joinMetadata.JoinName = member.Name;

            var property = member as PropertyInfo;

            if (property != null)
            {
                var getMethod = property.GetGetMethod(true);
                if (getMethod == null)
                {
                    throw new PlatformException("类型 {0} 的级联属性 {1} 必须可读。", member.DeclaringType, member.Name);
                }

                joinMetadata.Method   = getMethod;
                joinMetadata.JoinType = MethodJoinType.PropertyGet;

                // set
                var setMethod = property.GetSetMethod(true);
                if (setMethod == null)
                {
                    throw new PlatformException("类型 {0} 的级联属性 {1} 必须可写。", member.DeclaringType, member.Name);
                }

                var setDefine = new ClassJoinDefineMetadata();
                setDefine.Method   = setMethod;
                setDefine.JoinType = MethodJoinType.PropertySet;
                setDefine.JoinName = member.Name;

                metadata.ClassJoinDefines.Add(setDefine.Method, setDefine);
            }
            else
            {
                joinMetadata.JoinType = MethodJoinType.Method;
                joinMetadata.Method   = (MethodInfo)member;
            }
            metadata.ClassJoinDefines.Add(joinMetadata.Method, joinMetadata);
        }