コード例 #1
0
 /// <summary>
 /// 设置要修改的数据
 /// </summary>
 /// <param name="updateItem">要修改的数据</param>
 /// <param name="range">修改值的字段范围</param>
 /// <param name="upfieldnames">range指定的字段范围的字段名称</param>
 public void SetUpdateItem(T updateItem, FieldSelectRange range, IEnumerable <string> upfieldnames)
 {
     UpdateItem       = updateItem;
     UpdateFieldRange = range;
     UpdateFieldNames = upfieldnames;
     OnUpdateItemChanged();
 }
コード例 #2
0
        /// <summary>
        /// 缺省添加或修改检查
        /// </summary>
        /// <param name="errs"></param>
        protected void DefaultCheckAddOrUpdate(IList <DataModalFieldException> errs)
        {
            IDataUpdateContext modalcontext = CurrentContext as IDataUpdateContext;

            if (modalcontext.ModalType != null &&
                modalcontext.Data != null &&
                ((modalcontext.ModalState & ModalState.AddNew) == ModalState.AddNew ||
                 (modalcontext.ModalState & ModalState.Update) == ModalState.Update))
            {
                //检测范围
                FieldSelectRange     rangle           = modalcontext.CheckRangle;
                IEnumerable <string> ranglefieldnames = modalcontext.CheckFieldNames;
                //数据模型
                IDataModel dm = modalcontext.ModalType.GetDataModel();
                IEnumerable <IDataFieldModel> fields = dm.Fields;
                //组合值唯一规则
                IEnumerable <OnlyValueKeysAttribute> onlyattrs =
                    SelectAttributesFromType <OnlyValueKeysAttribute>(modalcontext.ModalType);
                List <OnlyValueKeysAttribute> effects = new List <OnlyValueKeysAttribute>();
                List <string> effectnames             = new List <string>();

                #region 检查每个字段

                foreach (var field in fields)
                {
                    //忽略该忽略的字段
                    if (IsIgnoreCheckField(field, rangle, ranglefieldnames))
                    {
                        continue;
                    }
                    //检测:是否可为空、字符长度、数字范围
                    CheckAddOrUpdateFieldValue(dm, field, field.GetModelFieldValue(modalcontext.Data), errs);
                    if (onlyattrs != null)
                    {
                        //查找并添加该字段影响到的唯一规则 到检测集合中
                        //条件:OnlyValueKeysAttribute.OnlyKeys包含该字段
                        effects.AddRange(onlyattrs.Where(f => f.OnlyKeys != null &&
                                                         f.OnlyKeys.FirstOrDefault(f2 => string.Equals(f2, field.Name, StringComparison.OrdinalIgnoreCase)) != null
                                                         ));
                        effectnames.Add(field.Name);
                    }
                }

                #endregion

                //检查唯一规则
                foreach (var ef in effects)
                {
                    CheckOnlyValues(dm, ef, effectnames, modalcontext, errs);
                }

                //引用检查
                CheckDataIdRefrence(dm, modalcontext, errs);
            }
        }
コード例 #3
0
        /// <summary>
        /// 是否忽略检查字段
        /// </summary>
        /// <param name="field"></param>
        /// <param name="rangle"></param>
        /// <param name="ranglefieldnames"></param>
        /// <returns></returns>
        private bool IsIgnoreCheckField(
            IDataFieldModel field,
            FieldSelectRange rangle,
            IEnumerable <string> ranglefieldnames)
        {
            if (field == null)
            {
                return(true);
            }
            if (field.IsRowVersion())
            {
                return(true);
            }
            if (field.IsSoftDeleteField())
            {
                return(true);
            }
            if (field.GetDbGeneratedDefine() != null)
            {
                return(true);
            }
            switch (rangle)
            {
            case FieldSelectRange.IgnoreFields:     //忽略指定的字段
            {
                //指定字段是否是忽略的字段
                return(ranglefieldnames != null && ranglefieldnames.FirstOrDefault(f => string.Equals(f, field.Name, StringComparison.OrdinalIgnoreCase)) != null);
            }

            case FieldSelectRange.OnlyFields:     //仅检测指定的字段
            {
                //指定的字段是否在指定字段中
                //如果不在则返回true,否则返回false
                if (ranglefieldnames == null)
                {
                    return(true);
                }
                return(ranglefieldnames.FirstOrDefault(f => string.Equals(f, field.Name, StringComparison.OrdinalIgnoreCase)) == null);
            }
            }
            return(false);
        }
コード例 #4
0
        /// <summary>
        /// 修改数据
        /// </summary>
        /// <typeparam name="T">要修改的数据类型</typeparam>
        /// <param name="updateitem">要修改的数据</param>
        /// <param name="updaterangle">要修改的数据的字段范围</param>
        /// <param name="updatefieldnames">updaterangle指定的范围的字段数组</param>
        /// <param name="noty">修改数据的通知</param>
        /// <returns>返回修改数据的上下文</returns>
        protected DataUpdateContext UpdateData <T>(T updateitem, FieldSelectRange updaterangle, IEnumerable <string> updatefieldnames, IUpdateDataNoty noty)
        {
            CheckDataModelIsCanUpdate <T>();
            DataUpdateContext dc = new DataUpdateContext()
            {
                CheckRangle      = updaterangle,
                CheckFieldNames  = updatefieldnames,
                UpdateRangle     = updaterangle,
                UpdateFieldNames = updatefieldnames,
                Data             = updateitem,
                ModalState       = ModalState.Update,
                ModalType        = typeof(T),
                UpdateDataNoty   = noty
            };
            string softdelKey = typeof(T).GetDataModel().GetSoftDeleteFieldName();

            if (!string.IsNullOrEmpty(softdelKey))
            {
                switch (updaterangle)
                {
                case FieldSelectRange.All:
                {
                    dc.CheckRangle      = FieldSelectRange.IgnoreFields;
                    dc.CheckFieldNames  = new string[] { softdelKey };
                    dc.UpdateRangle     = FieldSelectRange.IgnoreFields;
                    dc.UpdateFieldNames = new string[] { softdelKey };
                    break;
                }

                case FieldSelectRange.IgnoreFields:
                {
                    IEnumerable <string> x = new string[] { softdelKey };
                    if (updatefieldnames != null)
                    {
                        if (updatefieldnames.FirstOrDefault(f => string.Equals(f, softdelKey, StringComparison.OrdinalIgnoreCase)) == null)
                        {
                            x = x.Union(updatefieldnames);
                        }
                        else
                        {
                            x = updatefieldnames;
                        }
                    }
                    dc.CheckFieldNames  = x;
                    dc.UpdateFieldNames = x;
                    break;
                }

                case FieldSelectRange.OnlyFields:
                {
                    if (updatefieldnames != null)
                    {
                        IEnumerable <string> x = updatefieldnames.Where(f => !string.Equals(f, softdelKey, StringComparison.OrdinalIgnoreCase)).ToArray();
                        dc.CheckFieldNames  = x;
                        dc.UpdateFieldNames = x;
                    }
                    break;
                }
                }
            }
            AddUpdateContext(dc);
            return(dc);
        }
コード例 #5
0
        /// <summary>
        /// 生成修改数据的Sql表达式
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="updateItem"></param>
        /// <param name="updaterange"></param>
        /// <param name="updatefields"></param>
        /// <param name="paramet"></param>
        /// <returns></returns>
        internal static string GetUpdateSql <T>(
            T updateItem,
            FieldSelectRange updaterange,
            IEnumerable <string> updatefields,
            out IEnumerable <IDataParamet> paramet)
            where T : class
        {
            paramet = null;
            if (updateItem == null)
            {
                throw new ObjectIsNullException(LocalResource.UpdateItem);
            }
            StringBuilder       wheresql = new StringBuilder();
            StringBuilder       setsql   = new StringBuilder();
            List <IDataParamet> paramets = new List <IDataParamet>();
            IDataModel          model    = typeof(T).GetDataModel();
            string namehz = GetIdKeyStringValues(updateItem, model);
            int    c      = 0;

            foreach (var k in model.PrimaryKeys)
            {
                IDataFieldModel f = model.Fields[k.Name];
                DataParamet     p = AppendParamet(paramets, namehz, f, updateItem);
                if (c == 0)
                {
                    wheresql.Append(string.Format("[{0}]={1}", f.Name, p.Name));
                }
                else
                {
                    wheresql.Append(string.Format(" AND [{0}]={1}", f.Name, p.Name));
                }
                c++;
            }
            if (wheresql.Length == 0) //没有任何主键信息
            {
                throw new NotFoundPrimaryKeyException(typeof(T));
            }
            IDataFieldModelCollection fields = model.Fields;

            c = 0;
            foreach (var f in fields)
            {
                if (f.IsRowVersion())
                {
                    continue;
                }
                if (f.GetDbGeneratedDefine() != null)
                {
                    continue;
                }
                if (f.IsPrimaryKey() != null)
                {
                    continue;
                }
                switch (updaterange)
                {
                case FieldSelectRange.All: break;

                case FieldSelectRange.OnlyFields:
                {
                    if (updatefields == null)
                    {
                        continue;
                    }
                    if (updatefields.FirstOrDefault(
                            ff => string.Equals(ff, f.Name, StringComparison.OrdinalIgnoreCase)) == null)
                    {
                        continue;
                    }
                    break;
                }

                case FieldSelectRange.IgnoreFields:
                {
                    if (updatefields != null)
                    {
                        if (updatefields.FirstOrDefault(
                                ff => string.Equals(ff, f.Name, StringComparison.OrdinalIgnoreCase)) != null)
                        {
                            continue;
                        }
                    }
                    break;
                }
                }
                DataParamet p = AppendParamet(paramets, namehz, f, updateItem);
                if (c == 0)
                {
                    setsql.AppendLine(string.Format("[{0}]={1}", f.Name, p.Name));
                }
                else
                {
                    setsql.AppendLine(string.Format(",[{0}]={1}", f.Name, p.Name));
                }
                c++;
            }
            if (setsql.Length == 0)
            {
                return(null);
            }

            paramet = paramets.ToArray();
            return(string.Format("UPDATE [{0}] SET {1} WHERE {2}", model.Name, setsql.ToString(), wheresql.ToString()));
        }