Example #1
0
        /// <summary>
        /// 检测唯一规则
        /// </summary>
        /// <param name="view"></param>
        /// <param name="dm"></param>
        /// <param name="onlyattr"></param>
        /// <param name="uponlyfields"></param>
        /// <param name="modalcontext"></param>
        /// <param name="errs"></param>
        private void CheckOnlyValues(
            IDataModel dm,
            OnlyValueKeysAttribute onlyattr,
            IEnumerable <string> uponlyfields,
            IDataUpdateContext modalcontext,
            IList <DataModalFieldException> errs)
        {
            if (((modalcontext.ModalState & ModalState.AddNew) == ModalState.AddNew ||
                 (modalcontext.ModalState & ModalState.Update) == ModalState.Update) &&
                onlyattr != null && onlyattr.OnlyKeys != null && onlyattr.OnlyKeys.Count() > 0 &&
                uponlyfields != null && uponlyfields.Count() > 0)
            {
                IDataSelector view = CurrentSelector;
                object        data = modalcontext.Data;
                //要查询的参数名称
                List <string> parametnames = new List <string>(onlyattr.OnlyKeys);
                //构建查选参数
                object paramet = modalcontext.ModalType.CreateObject();
                switch (modalcontext.ModalState)
                {
                case ModalState.AddNew:
                {
                    //设置所有唯一值
                    foreach (var str in parametnames)
                    {
                        var f = dm.Fields[str];
                        f.SetModelFieldValue(paramet, f.GetModelFieldValue(data));
                    }
                    break;
                }

                case ModalState.Update:
                {
                    paramet.SetPropertyValue("Id", data.GetPropertyValue("Id"));
                    object orgvalue = null;
                    foreach (var str in parametnames)
                    {
                        if (uponlyfields.FirstOrDefault(f => string.Equals(f, str, StringComparison.OrdinalIgnoreCase)) != null)
                        {
                            //值已修改
                            var f = dm.Fields[str];
                            f.SetModelFieldValue(paramet, f.GetModelFieldValue(data));
                        }
                        else
                        {
                            //值未修改
                            //获取原值
                            if (orgvalue == null)
                            {
                                orgvalue = view.GetDataById(modalcontext.ModalType, null, (long)data.GetMemberValue("Id"));
                            }
                            var f = dm.Fields[str];
                            f.SetModelFieldValue(paramet, f.GetModelFieldValue(orgvalue));
                        }
                    }
                    break;
                }
                }
                //全为null值时的策略
                if (!onlyattr.IsIncludeAllNull && IsAllNullValue(paramet, onlyattr.OnlyKeys, dm))
                {
                    return;
                }
                string softdelfieldname = dm.GetSoftDeleteFieldName();
                if (!string.IsNullOrEmpty(softdelfieldname))
                {
                    //该模型是软删除模型
                    //设置为未删除
                    if (!parametnames.Contains(softdelfieldname))
                    {
                        parametnames.Add(softdelfieldname);
                    }
                    dm.Fields[softdelfieldname].SetModelFieldValue(paramet, false);
                }

                List <string>       filters  = new List <string>();
                List <IDataParamet> filterpn = new List <IDataParamet>();
                foreach (var pn in parametnames)
                {
                    IDataParamet pv;
                    string       f = QuerySqlFactory.CreateEqWhere(view.DbTypeName, pn, dm.Fields[pn].GetModelFieldValue(paramet), out pv);
                    if (!string.IsNullOrEmpty(f))
                    {
                        filters.Add(f);
                    }
                    if (pv != null)
                    {
                        filterpn.Add(pv);
                    }
                }

                switch (modalcontext.ModalState)
                {
                case ModalState.Update:
                {
                    //排除本身的条件
                    long         id = (long)data.GetPropertyValue("Id");
                    IDataParamet pv;
                    string       f = QuerySqlFactory.CreateNotEqWhere(view.DbTypeName, "Id", id, out pv);
                    if (!string.IsNullOrEmpty(f))
                    {
                        filters.Add(f);
                    }
                    if (pv != null)
                    {
                        filterpn.Add(pv);
                    }
                    break;
                }
                }
                if (view.GetDataByAndFilterExpress(modalcontext.ModalType, filters, filterpn, new string[] { "Id" }) != null)
                {
                    AddOnlyValueErrors(onlyattr.OnlyKeys, dm, errs);
                }
            }
        }