Beispiel #1
0
        /// <summary>
        /// 生成删除数据的Sql表达式
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="deleteItem"></param>
        /// <param name="paramet"></param>
        /// <returns></returns>
        internal static string GetDeleteSql <T>(
            T deleteItem,
            out IEnumerable <IDataParamet> paramet)
        {
            paramet = null;
            if (deleteItem == null)
            {
                throw new ObjectIsNullException(LocalResource.DeleteItem);
            }

            StringBuilder       wheresql = new StringBuilder();
            List <IDataParamet> paramets = new List <IDataParamet>();
            IDataModel          model    = typeof(T).GetDataModel();
            string namehz = GetIdKeyStringValues(deleteItem, model);
            int    c      = 0;

            foreach (var k in model.PrimaryKeys)
            {
                IDataFieldModel f = model.Fields[k.Name];
                DataParamet     p = AppendParamet(paramets, namehz, f, deleteItem);
                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));
            }
            paramet = paramets.ToArray();
            string sdf = model.GetSoftDeleteFieldName();

            if (!string.IsNullOrEmpty(sdf))
            {
                return(string.Format("UPDATE {0} SET {1}=1 WHERE {2}",
                                     MsSqlServerHelper.GetFeildNameInSqlExpress(model.Name),
                                     MsSqlServerHelper.GetFeildNameInSqlExpress(sdf),
                                     wheresql.ToString()));
            }
            else
            {
                return(string.Format("DELETE {0} WHERE {1}", GetFeildNameInSqlExpress(model.Name), wheresql.ToString()));
            }
        }
Beispiel #2
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);
                }
            }
        }