/// <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); } } }