Ejemplo n.º 1
0
        private void TrySetProperty(Entity e, string pName, JToken value)
        {
            //有些小写的客户端数据被传输到了服务端,需要被过滤掉。
            if (char.IsLower(pName[0]))
            {
                return;
            }

            var pm = _entityMeta.Property(pName) as PropertyMeta ??
                     _entityMeta.ChildrenProperty(pName);

            if (pm != null)
            {
                var mp = pm.ManagedProperty;
                if (mp is IListProperty)
                {
                    //todo: 此处的性能可能需要优化,聚合保存子列表时,重复的查询 Repository
                    var entityType = EntityMatrix.FindByList(pm.PropertyType).EntityType;
                    var repo       = RF.Find(entityType);

                    //列表属性的设置不能使用 SetProperty,否则,list.Parent 将会无值。
                    //但是也不能直接使用 LoadProperty,否则会导致调用 list.MarkOld,从而不会保存这个列表。
                    //所以只能先装载一个空列表,然后再把 json 中的数据转换为实体加入到这个列表中。
                    var list = repo.NewList();
                    e.LoadProperty(mp, list);

                    ListReader.JsonToEntity(value as JObject, repo, list);
                }
                else
                {
                    var rawValue = (value as JValue).Value;

                    rawValue = EntityJsonConverter.ToServerValue(pm.PropertyType, rawValue);

                    e.SetProperty(mp, rawValue, ManagedPropertyChangedSource.FromUIOperating);
                }
            }
            else
            {
                var rawValue = (value as JValue).Value;

                //如果没有找到一般的属性,则尝试查找外键属性
                for (int i = 0, c = _refIdProperties.Count; i < c; i++)
                {
                    var rip = _refIdProperties[i];
                    if (rip.Name == pName)
                    {
                        e.SetRefId(rip, rawValue);
                        break;
                    }
                }
                //只读属性。
                //if(notFound)
                //{
                //    throw new InvalidOperationException("没有在实体中找到这个属性:" + pName);
                //}
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 把实体列表对应的 json 转换为 EntityList 对象。
        /// </summary>
        /// <param name="jEntityList"></param>
        /// <param name="repository">如果没有显式指定 Repository,则会根据 json 中的 _model 属性来查找对应的实体仓库。</param>
        /// <param name="resultEntityList">如果显式指定 Repository,则会把转换的实体对象都加入到这个列表中。</param>
        /// <returns></returns>
        internal static EntityList JsonToEntity(JObject jEntityList, EntityRepository repository = null, EntityList resultEntityList = null)
        {
            if (repository == null)
            {
                var modelProperty = jEntityList.Property("_model");
                if (modelProperty == null)
                {
                    throw new NotSupportedException("实体列表对应的 Json 应该有 _model 属性。");
                }
                var model        = modelProperty.Value.CastTo <JValue>().Value.CastTo <string>();
                var clientEntity = ClientEntities.Find(model);
                repository = RF.Find(clientEntity.EntityType);
            }

            ListReader reader = repository.SupportTree ? new TreeEntityListReader() : new EntityListReader() as ListReader;

            reader.Repository       = repository;
            reader.ChangeSet        = jEntityList;
            reader.ResultEntityList = resultEntityList;

            reader.Read();

            return(reader.ResultEntityList);
        }
Ejemplo n.º 3
0
 internal static EntityList JsonToEntityList(JObject jEntityList, EntityRepository repository = null)
 {
     return(ListReader.JsonToEntity(jEntityList, repository));
 }