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); //} } }
/// <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); }
internal static EntityList JsonToEntityList(JObject jEntityList, EntityRepository repository = null) { return(ListReader.JsonToEntity(jEntityList, repository)); }