Example #1
0
        public static Entity AddHeader(this Entity entity, string name, string @class, Action <HeaderDesign> options = null)
        {
            var headerBag   = entity.WithProperties(HeaderDesign.BagName);
            var headerNames = headerBag.WithCollection(@class);

            var nameExists = headerNames.Any(x => (x as CaseVariantString)?.Value.EqualsIgnoreCase(name) == true);

            if (!nameExists)
            {
                headerNames.Add((CaseVariantString)name);
            }

            var headerEntity = (
                from e in entity?.Entities ?? Enumerable.Empty <Entity>()
                where e.Rel.Has(@class)
                where name.EqualsIgnoreCase((e.Properties?["Name"] as CaseVariantString)?.Value)
                select e
                ).FirstOrDefault();

            if (headerEntity == null && options != null)
            {
                var title = name.ChangeCase(TextCase.ProperCase);
                headerEntity = new Entity();
                headerEntity.AddClass(Class.Header);
                headerEntity.AddRel(@class);
                headerEntity.SetTitle(title);
                headerEntity.SetProperty("Name", (CaseVariantString)name);
                headerEntity.SetProperty("Title", title);
                entity.WithEntities().Add(headerEntity);
            }

            options?.Invoke(new HeaderDesign(headerEntity));

            return(entity);
        }
Example #2
0
 /****/
 public static void SetMaxInventoryItemCount(this Entity entity, short count)
 {
     entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.InventoryItemMax, count)
     {
         IsDirtyable = false
     });
 }
Example #3
0
 /****/
 public static void SetValidInventoryItems(this Entity entity, List <ItemTypeEnum> items)
 {
     entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.ValidInventoryItems, items)
     {
         IsDirtyable = false
     });
 }
Example #4
0
        public string SaveTemplate(HttpRequest request)
        {
            LoggerHelper.Info("Start");
            Entity entity = null;

            try
            {
                Page page = GetPage(request);
                entity = CreateEntity(request, page);

                List <PageField> fields = GetEscapeFields(page);
                foreach (PageField field in fields)
                {
                    LoggerHelper.Debug(field.FieldName + " is escapetext");
                    string escapeText = Microsoft.JScript.GlobalObject.unescape(entity.GetProperty(field.FieldName));
                    entity.SetProperty(field.FieldName, escapeText);
                }

                GetCatalogDAO(page).SaveEntity(entity);
            }
            catch (Exception e)
            {
                LoggerHelper.Error(e);
                return(ErrorResponse(e));
            }
            finally
            {
                LoggerHelper.Info("End");
            }

            return(SuccessResponse(entity));
        }
Example #5
0
        /// <summary>
        /// Returns the list of connections specified in the Web.config
        ///
        /// If user is not part of the app support team an error is returned.
        /// </summary>
        /// <param name="request">The request</param>
        /// <returns>A JSON array</returns>
        public virtual string GetConnections(HttpRequest request)
        {
            IList <Entity> list = new List <Entity>();

            LoggerHelper.Info("Start");
            try
            {
                if (!CheckPermissions())
                {
                    return(ErrorResponse("User don't have permissions to use this functionality."));
                }

                foreach (ConnectionStringSettings connSettings in ConfigurationManager.ConnectionStrings)
                {
                    //LocalSqlServer,LocalMySqlServer,OraAspNetConString default connections in machine.config
                    if ("LocalSqlServer" != connSettings.Name && "LocalMySqlServer" != connSettings.Name && "OraAspNetConString" != connSettings.Name)
                    {
                        Entity entity = new Entity("Connection");
                        entity.SetProperty("ConnName", connSettings.Name);
                        list.Add(entity);
                    }
                }
            }
            catch (Exception e)
            {
                LoggerHelper.Error(e);
                return(ErrorResponse(e));
            }
            finally
            {
                LoggerHelper.Info("End");
            }

            return(ListResponse(list));
        }
Example #6
0
        public void PerformBehaviour(Entity target, Entity instigator)
        {
            if (instigator == null)
            {
                // angry at nobody.
                return;
            }

            if (!instigator.HasProperty((int)EntityPropertyEnum.RemotePlayer))
            {
                // not angry at a player.
                return;
            }

            List <int> aggroList;

            if (target.HasProperty((int)GameEntityPropertyEnum.AggroList))
            {
                aggroList = (List <int>)target.GetProperty((int)GameEntityPropertyEnum.AggroList).ObjectValue;
            }
            else
            {
                aggroList = new List <int>(5);
                target.SetProperty(new EntityProperty((int)GameEntityPropertyEnum.AggroList, aggroList)
                {
                    IsDirtyable = false
                });
            }

            if (!aggroList.Contains(instigator.EntityId))
            {
                aggroList.Add(instigator.EntityId);
            }
        }
Example #7
0
        /// <summary>
        /// 遍历 JSON 对象的属性,并使用托管属性 API 来设置一般属性的值。
        /// </summary>
        /// <param name="jObject"></param>
        /// <param name="entity"></param>
        private static void DeserializeProperties(JObject jObject, Entity entity)
        {
            var properties = entity.PropertiesContainer.GetAvailableProperties();

            foreach (var mp in properties)
            {
                if (mp != Entity.IdProperty)
                {
                    JToken jValue = null;
                    if (jObject.TryGetValue(mp.Name, StringComparison.OrdinalIgnoreCase, out jValue))
                    {
                        if (mp is IListProperty)
                        {
                            DeserializeList(entity, mp as IListProperty, jValue as JArray);
                        }
                        //一般属性。
                        else
                        {
                            var value = (jValue as JValue).Value;
                            entity.SetProperty(mp, value, ManagedPropertyChangedSource.FromUIOperating);
                        }
                    }
                }
            }

            //using (var jsonTextReader = new StringReader(strContent))
            //{
            //    var jsonSerializer = JsonSerializer.Create(this.SerializerSettings);
            //    jsonSerializer.Populate(jsonTextReader, entity);
            //}
        }
Example #8
0
        private Entity GetTemplate(HttpRequest request)
        {
            string       templateName = request.Params["templateName"];
            string       templateType = request.Params["templateType"];
            IPageInfoDAO pageDAO      = (IPageInfoDAO)FactoryUtils.GetDAO(ConfigurationManager.AppSettings["IPageInfoDAO"]);

            EPE.Common.Entities.Page.Page pageLetter = pageDAO.GetPageConfig("", "Templates");

            Entity entityLetter = EntityUtils.CreateEntity(pageLetter);

            entityLetter.SetProperty("TemplateName", templateName);
            entityLetter.SetProperty("TemplateTypeText", templateType);

            IList <Entity> templates = DAOFactory.Instance.GetCatalogDAO().FindEntities(entityLetter, FilterInfo.SearchType.AND);

            return(templates[0]);
        }
Example #9
0
 public static void SetVisibleRating(this Entity entity, float value)
 {
     value = Math.Max(Math.Min(1, value), 0);
     entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.VisibleRating, value)
     {
         IsDirtyable = false
     });
 }
Example #10
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);
                //}
            }
        }
Example #11
0
        private bool ValidateUser(string userName, string passWord)
        {
            EPE.Common.Entities.Page.Page usersPage = DAOFactory.Instance.GetPageInfoDAO().GetPageConfig("", "Users");
            Entity entity = EntityUtils.CreateEntity(usersPage);

            entity.SetProperty("USE_Login", userName);
            entity.SetProperty("USE_Password", passWord);

            IList <Entity> list = DAOFactory.Instance.GetCatalogDAO().FindEntities(entity, FilterInfo.SearchType.AND);

            if (list.Count == 1)
            {
                Session["CurrentUser"]      = list[0];
                Session["CurrentUserLogin"] = userName;
                return(true);
            }

            return(false);
        }
Example #12
0
 public static void IncreaseWeaponUseCount(this Entity entity)
 {
     if (!entity.HasProperty(GameEntityPropertyEnum.WeaponUseCount))
     {
         entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.WeaponUseCount, 1));
     }
     else
     {
         entity.GetProperty(GameEntityPropertyEnum.WeaponUseCount).ByteValue += 1;
     }
 }
Example #13
0
        private void SetNextMoan(Entity target, double now)
        {
            var nextMoan = now + (StaticRng.Random.NextDouble() * RandomDelayMultiplier) + BaseDelay;

            target.SetProperty(
                new EntityProperty((short)GameEntityPropertyEnum.NextZombieMoan, nextMoan)
            {
                IsDirtyable = false
            }
                );
        }
Example #14
0
        /****/
        public static long GetMinNoiseChaseTime(this Entity entity)
        {
            if (!entity.HasProperty(GameEntityPropertyEnum.ChaseNoiseMinTime))
            {
                var minChaseTime = entity.GetChaseMinTime();
                entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.ChaseNoiseMinTime, minChaseTime));
            }

            var prop = entity.GetProperty(GameEntityPropertyEnum.ChaseNoiseMinTime);

            return(prop.LongValue);
        }
Example #15
0
        public static void SetInventoryItem(this Entity entity, InventoryItem item, ItemSpec itemSpec = null)
        {
            StaticFloatingItemCache.Instance.RegisterItem(item, entity);

            if (itemSpec == null)
            {
                itemSpec = item.GetItemSpec();
            }

            entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.ItemSpecId, itemSpec.Id));
            entity.SetNameplate(itemSpec.GetName());
            entity.SetModel(itemSpec.GetModelName());
            entity.SetNameplateColour(Colours.Yellow);
        }
Example #16
0
        /// <summary>
        /// 遍历 JSON 对象的属性,并使用托管属性 API 来设置一般属性的值。
        /// </summary>
        /// <param name="jObject"></param>
        /// <param name="entity"></param>
        private void DeserializeProperties(JObject jObject, Entity entity)
        {
            var properties = entity.PropertiesContainer.GetAvailableProperties();

            foreach (var propertyValue in jObject)
            {
                var propertyName = propertyValue.Key;
                var jValue       = propertyValue.Value;
                var mp           = properties.Find(propertyName, true);
                if (mp != null)
                {
                    if (mp != Entity.IdProperty)
                    {
                        if (mp is IListProperty)
                        {
                            DeserializeList(entity, mp as IListProperty, jValue as JArray);
                        }
                        //一般属性。
                        else
                        {
                            var value = (jValue as JValue).Value;
                            if (value is string && mp.PropertyType == typeof(byte[]))
                            {
                                value = Encoding.UTF8.GetBytes(value as string);
                            }
                            entity.SetProperty(mp, value, ManagedPropertyChangedSource.FromUIOperating);
                        }
                    }
                }
                else
                {
                    //如果指定了状态,则主动设置该实体的状态。
                    if (propertyName.EqualsIgnoreCase(PersistenceStatusProperty))
                    {
                        var value  = (jValue as JValue).Value;
                        var status = (PersistenceStatus)Enum.Parse(typeof(PersistenceStatus), value.ToString(), true);
                        entity.PersistenceStatus = status;
                    }
                }
            }

            //using (var jsonTextReader = new StringReader(strContent))
            //{
            //    var jsonSerializer = JsonSerializer.Create(this.SerializerSettings);
            //    jsonSerializer.Populate(jsonTextReader, entity);
            //}
        }
Example #17
0
        public static void RemoveInventory(this Entity entity)
        {
            if (!entity.HasInventory())
            {
                return;
            }

            var inv = entity.GetInventory();

            entity.SetInventoryId(StaticInventoryCache.Instance.UnknownId);
            entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.EntityRegisteredWithInventory, false)
            {
                IsPersistant = false, IsDirtyable = false, IsDirty = false
            });

            StaticInventoryCache.Instance.RemoveInventory(inv.Id);
        }
Example #18
0
        public void PerformBehaviour(Entity target, Entity instigator)
        {
            if (!target.HasInventory())
            {
                return;
            }

            var inventory = target.GetInventory();
            var item      = inventory[_slotId];

            var itemSpecId = StaticItemSpecCache.Instance.EmptySpecId;

            if (item != null)
            {
                itemSpecId = item.ItemSpecId;
            }

            target.SetProperty(new EntityProperty((short)_entityProperty, itemSpecId));
        }
Example #19
0
        public static void SetInventory(this Entity entity, Inventory value)
        {
            Debug.Assert(!entity.HasRegisteredWithInventory(), "Entity already has inventory");
            entity.SetProperty(new EntityProperty((short)GameEntityPropertyEnum.EntityRegisteredWithInventory, true)
            {
                IsPersistant = false, IsDirtyable = false, IsDirty = false
            });
            entity.SetInventoryId(value.Id);

            value.OnSlotChanged +=
                (inv, slotIndex) =>
            {
                entity.PerformBehaviour((short)GameEntityBehaviourEnum.OnInventoryChange, null);
            };

            value.OnSlotChanged +=
                (inv, slotIndex) =>
            {
                if (slotIndex == (byte)InventorySpecialSlotEnum.PrimaryWeapon)
                {
                    entity.PerformBehaviour((short)GameEntityBehaviourEnum.OnPrimaryWeaponChange, null);
                }
            };

            value.OnSlotChanged +=
                (inv, slotIndex) =>
            {
                if (slotIndex == (byte)InventorySpecialSlotEnum.SecondaryWeapon)
                {
                    entity.PerformBehaviour((short)GameEntityBehaviourEnum.OnSecondaryWeaponChange, null);
                }
            };

            value.OnSlotChanged +=
                (inv, slotIndex) =>
            {
                if (slotIndex == (byte)InventorySpecialSlotEnum.HeadArmour)
                {
                    entity.PerformBehaviour((short)GameEntityBehaviourEnum.OnHeadSlotChange, null);
                }
            };
        }
Example #20
0
 /// <summary>
 /// 有必要的话,就修改Name
 /// </summary>
 /// <param name="newObject"></param>
 private void TryModifyName(Entity newObject, bool modifyName)
 {
     if (modifyName)
     {
         if (newObject is IHasHame)
         {
             var no = newObject as IHasHame;
             no.Name += "-新增";
         }
         else
         {
             var mp = newObject.PropertiesContainer.GetAvailableProperties().Find("Name");
             if (mp != null && !mp.IsReadOnly)
             {
                 string name = newObject.GetProperty(mp).ToString();
                 newObject.SetProperty(mp, name + "-新增");
             }
         }
     }
 }
Example #21
0
        /// <summary>
        /// Saves the specified entity in a Oracle database.
        /// </summary>
        /// <param name="entity">The entity to be saved</param>
        public virtual void SaveEntity(Entity entity)
        {
            LoggerHelper.Info("Start");
            try
            {
                StringBuilder query;
                if (string.IsNullOrEmpty(entity.GetEntityId())) // New entity Insert
                {
                    query = GetQueryBuilder().BuildInsertQuery(entity);
                    LoggerHelper.Debug(query.ToString());
                    Int32 newId = GetQueryRunner().ExecuteScalar(GetConnection(), query);
                    entity.SetProperty(entity.GetFieldId().Name, newId.ToString());
                }
                else //update
                {
                    if (entity.GetFieldId() == null)
                    {
                        LoggerHelper.Error("Entity does not have an Id field defined.");
                    }

                    query = GetQueryBuilder().BuildUpdateQuery(entity);
                    LoggerHelper.Debug(query.ToString());
                    GetQueryRunner().ExecuteNonQuery(GetConnection(), query);
                }
            }
            catch (Exception e)
            {
                if (e.Message.Contains("UNIQUE KEY"))
                {
                    throw new Exception(entity.GetTableName() + " already exists.");
                }
                else
                {
                    throw new Exception("Unable to save " + entity.GetTableName() + ".", e);
                }
            }
            finally
            {
                LoggerHelper.Info("End");
            }
        }
        /// <summary>
        /// 多选模式下的写值操作
        /// </summary>
        /// <param name="curEntity">正在编辑的实体。</param>
        /// <param name="svm">选择视图模型</param>
        /// <param name="selectedEntities">当前被选择的实体</param>
        private SetSelectionResult SyncSelectionToValue_Multiple(Entity curEntity, SelectionViewMeta rvm, IList <Entity> selectedEntities)
        {
            var result = string.Join(rvm.SplitterIfMulti, selectedEntities.Select(i => this.GetSelectedValue(i)));

            //赋值给this.PropertyValue
            this.PropertyValue = result;

            SetSelectionResult res = (this.PropertyValue as string) == result ? SetSelectionResult.Success : SetSelectionResult.Cancel;

            if (res == SetSelectionResult.Success)
            {
                //此时这个属性应该是一个 int 数组类型
                if (rvm.RefIdHost != null)
                {
                    var idArray = selectedEntities.Select(i => i.Id).ToArray();
                    curEntity.SetProperty(rvm.RefIdHost, idArray, ManagedPropertyChangedSource.FromUIOperating);
                }
            }

            return(res);
        }
Example #23
0
        private Entity GetUser(string userLogin)
        {
            if (string.IsNullOrEmpty(userLogin))
            {
                return(null);
            }

            if (Session["CurrentUser"] == null)
            {
                EPE.Common.Entities.Page.Page usersPage = DAOFactory.Instance.GetPageInfoDAO().GetPageConfig("", "Users");
                Entity entity = EntityUtils.CreateEntity(usersPage);
                entity.SetProperty("USE_Login", userLogin);

                IList <Entity> list = DAOFactory.Instance.GetCatalogDAO().FindEntities(entity);
                if (list.Count == 1)
                {
                    Session["CurrentUser"] = list[0];
                    Entity user = (Entity)Session["CurrentUser"];
                    Session["CurrentUserName"] = user.GetProperty("USE_Name");
                }
            }

            return((Entity)Session["CurrentUser"]);
        }
Example #24
0
 /// <summary>
 /// 有必要的话,就修改Name
 /// </summary>
 /// <param name="newObject"></param>
 private void TryModifyName(Entity newObject, bool modifyName)
 {
     if (modifyName)
     {
         if (newObject is IHasHame)
         {
             var no = newObject as IHasHame;
             no.Name += "-新增";
         }
         else
         {
             var mp = newObject.PropertiesContainer.GetAvailableProperties().Find("Name");
             if (mp != null && !mp.IsReadOnly)
             {
                 string name = newObject.GetProperty(mp).ToString();
                 newObject.SetProperty(mp, name + "-新增");
             }
         }
     }
 }
        /// <summary>
        /// 设置某个实体的审核状态。
        /// </summary>
        /// <param name="me">Me.</param>
        /// <param name="value">The value.</param>
        public static void SetTenantId(this Entity me, long value)
        {
            var mp = me.PropertiesContainer.GetCompiledProperties().Find(TenantIdProperty);

            me.SetProperty(mp, value);
        }
        /// <summary>
        /// Modifies the EntityTuple.ReducedEntity by replacing related entities with their corresponding clones from the reduced entity set
        /// </summary>
        /// <param name="entityTuple"></param>
        /// <param name="flatTransmissionSet"></param>
        protected virtual void FixupRelations(EntityTuple <Entity> entityTuple, IEnumerable <EntityTuple <Entity> > flatTransmissionSet)
        {
            Entity entity        = entityTuple.Entity;
            Entity reducedEntity = entityTuple.ReducedEntity;

            switch (reducedEntity.ChangeTracker.State)
            {
            case ObjectState.Added:
            {
                // copy navigation properties
                var navigationProperties = entity.PropertyInfos
                                           .Where(p => p.IsPhysical && p.Attributes.Any(attribute => attribute is NavigationPropertyAttribute))
                                           .Select(p => p.PropertyInfo);

                foreach (var navigationProperty in navigationProperties)
                {
                    var referencedInstance = navigationProperty.GetValue(entity, null);

                    var referencedEntityCollection = referencedInstance as ITrackableCollection;
                    if (!ReferenceEquals(null, referencedEntityCollection))
                    {
                        if (referencedEntityCollection.Count > 0)
                        {
                            var collection = navigationProperty.GetValue(reducedEntity, null) as ITrackableCollection;

                            foreach (Entity referencedEntity in referencedEntityCollection)
                            {
                                // lookup reduced version of current value (entity)
                                Entity changeSetEntity;
                                var    entry = flatTransmissionSet.FirstOrDefault(e => e.Entity.Equals(referencedEntity));
                                if (entry != null)
                                {
                                    changeSetEntity = entry.ReducedEntity;
                                }
                                else
                                {
                                    // in case of directed relation (i.e. only one entity has a relation to the other and the other entity has not relation back)
                                    // the related entity might not yet be in the change set and has to be specifically created
                                    changeSetEntity = ReduceToModifications(referencedEntity);
                                }

                                collection.Add(changeSetEntity);
                            }
                        }
                    }
                    else if (referencedInstance is Entity)
                    {
                        // lookup reduced version of current value (entity)
                        var entry = flatTransmissionSet.FirstOrDefault(e => e.Entity.Equals(referencedInstance));
                        if (entry != null)
                        {
                            navigationProperty.SetValue(reducedEntity, entry.ReducedEntity, null);
                        }
                    }
                }
            }
            break;

            case ObjectState.Unchanged:
                if (entity.HasChanges)
                {
                    // there are changes in relations
                    goto case ObjectState.Modified;
                }
                break;

            case ObjectState.Modified:
            case ObjectState.Deleted:
            {
                // copy changed navigation properties (relations and foreign keys)

                // single relation
                var physicalProperties = entity.PropertyInfos.Where(p => p.IsPhysical && p.Attributes.Any(attribute => attribute is NavigationPropertyAttribute)).ToDictionary(p => p.Name);
                foreach (var property in entity.ChangeTracker.OriginalValues.Where(p => physicalProperties.ContainsKey(p.Key)))
                {
                    if (!reducedEntity.ChangeTracker.OriginalValues.ContainsKey(property.Key))
                    {
                        // lookup reduced version of current value (entity)
                        Entity currentChangeSetEntity = null;
                        {
                            // get current value (entity)
                            var currentEntity = (Entity)entity.GetProperty(property.Key, true);
                            if (currentEntity != null)
                            {
                                var entry = flatTransmissionSet.FirstOrDefault(e => e.Entity.Equals(currentEntity));
                                if (entry != null)
                                {
                                    currentChangeSetEntity = entry.ReducedEntity;
                                }
                                else
                                {
                                    // in case of directed relation (i.e. only one entity has a relation to the other and the other entity has not relation back)
                                    // the related entity might not yet be in the change set and has to be specifically created
                                    currentChangeSetEntity = ReduceToModifications(currentEntity);
                                }
                            }
                        }

                        Entity originalChangeSetEntity = null;
                        {
                            // get current value (entity)
                            var currentEntity = (Entity)entity.ChangeTracker.OriginalValues[property.Key];
                            if (currentEntity != null)
                            {
                                var entry = flatTransmissionSet.FirstOrDefault(e => e.Entity.Equals(currentEntity));
                                if (entry != null)
                                {
                                    originalChangeSetEntity = entry.ReducedEntity;
                                }
                                else
                                {
                                    // in case of directed relation (i.e. only one entity has a relation to the other and the other entity has not relation back)
                                    // the related entity might not yet be in the change set and has to be specifically created
                                    originalChangeSetEntity = ReduceToModifications(currentEntity);
                                }
                            }
                        }

                        reducedEntity.SetProperty(property.Key, currentChangeSetEntity, true);
                        reducedEntity.ChangeTracker.OriginalValues[property.Key] = originalChangeSetEntity;
                    }
                }

                // relation added to collection
                foreach (var relation in entity.ChangeTracker.ObjectsAddedToCollectionProperties)
                {
                    var navigationProperty = reducedEntity.GetType().GetProperty(relation.Key).GetValue(reducedEntity, null) as ITrackableCollection;
                    var objectList         = new EntityList();
                    foreach (var referencedEntity in relation.Value)
                    {
                        // lookup reduced version of current value (entity)
                        Entity changeSetEntity;
                        var    entry = flatTransmissionSet.FirstOrDefault(e => e.Entity.Equals(referencedEntity));
                        if (entry != null)
                        {
                            changeSetEntity = entry.ReducedEntity;
                        }
                        else
                        {
                            // in case of directed relation (i.e. only one entity has a relation to the other and the other entity has not relation back)
                            // the related entity might not yet be in the change set and has to be specifically created
                            changeSetEntity = ReduceToModifications(referencedEntity);
                        }

                        if (changeSetEntity != null && !navigationProperty.Contains(changeSetEntity))
                        {
                            navigationProperty.Add(changeSetEntity);
                            objectList.Add(changeSetEntity);
                        }
                    }

                    if (reducedEntity.ChangeTracker.ObjectsAddedToCollectionProperties.ContainsKey(relation.Key))
                    {
                        continue;
                    }

                    reducedEntity.ChangeTracker.ObjectsAddedToCollectionProperties.Add(relation.Key, objectList);
                }

                // relation removed from collection
                foreach (var relation in entity.ChangeTracker.ObjectsRemovedFromCollectionProperties)
                {
                    var objectList = new EntityList();
                    foreach (var referencedEntity in relation.Value)
                    {
                        // lookup reduced version of current value (entity)
                        Entity changeSetEntity;
                        var    entry = flatTransmissionSet.FirstOrDefault(e => e.Entity.Equals(referencedEntity));
                        if (entry != null)
                        {
                            changeSetEntity = entry.ReducedEntity;
                        }
                        else
                        {
                            // in case of directed relation (i.e. only one entity has a relation to the other and the other entity has no relation back)
                            // the related entity might not yet be in the change set and has to be specifically created
                            changeSetEntity = ReduceToModifications(referencedEntity);
                        }

                        if (changeSetEntity != null)
                        {
                            objectList.Add(changeSetEntity);
                        }
                    }

                    reducedEntity.ChangeTracker.ObjectsRemovedFromCollectionProperties.Add(relation.Key, objectList);
                }
            }
            break;

            default:
                throw new InvalidOperationException();
            }
        }
Example #27
0
        /// <summary>
        /// 遍历 JSON 对象的属性,并使用托管属性 API 来设置一般属性的值。
        /// </summary>
        /// <param name="jObject"></param>
        /// <param name="entity"></param>
        private void DeserializeProperties(JObject jObject, Entity entity)
        {
            var properties = entity.PropertiesContainer.GetAvailableProperties();
            foreach (var propertyValue in jObject)
            {
                var propertyName = propertyValue.Key;
                var jValue = propertyValue.Value;
                var mp = properties.Find(propertyName, true);
                if (mp != null)
                {
                    //id 属性需要提前处理,而不需要在这里直接反序列化。
                    if (mp == Entity.IdProperty) continue;

                    if (mp is IListProperty)
                    {
                        DeserializeList(entity, mp as IListProperty, jValue as JArray);
                    }
                    else if (mp is IRefEntityProperty)
                    {
                        //一般引用属性不支持反序列化。
                    }
                    //一般属性。
                    else
                    {
                        object value = null;

                        //对于数组的泛型列表类型,需要进行特殊的处理。
                        if (jValue is JArray)
                        {
                            var jArray = jValue as JArray;
                            var propertyType = mp.PropertyType;
                            if (propertyType.IsArray)
                            {
                                var elementType = propertyType.GetElementType();
                                var array = Array.CreateInstance(elementType, jArray.Count);
                                for (int i = 0, c = jArray.Count; i < c; i++)
                                {
                                    var itemTyped = TypeHelper.CoerceValue(elementType, jArray[i]);
                                    array.SetValue(itemTyped, i);
                                }
                                value = array;
                            }
                            else if (TypeHelper.IsGenericType(propertyType, typeof(List<>)))//List<string>
                            {
                                var elementType = propertyType.GetGenericArguments()[0];
                                var list = Activator.CreateInstance(propertyType) as IList;
                                for (int i = 0, c = jArray.Count; i < c; i++)
                                {
                                    var itemTyped = TypeHelper.CoerceValue(elementType, jArray[i]);
                                    list.Add(itemTyped);
                                }
                                value = list;
                            }
                            else
                            {
                                //如果不是数组类型或者泛型列表类型的属性,则不支持反序列化。
                                //do nothing;
                            }
                        }
                        else
                        {
                            value = (jValue as JValue).Value;

                            if (value is string && mp.PropertyType == typeof(byte[]))
                            {
                                value = Convert.FromBase64String(value as string);
                            }
                        }

                        entity.SetProperty(mp, value, ManagedPropertyChangedSource.FromUIOperating);
                    }
                }
                else
                {
                    //如果指定了状态,则主动设置该实体的状态。
                    if (propertyName.EqualsIgnoreCase(PersistenceStatusProperty))
                    {
                        var value = (jValue as JValue).Value;
                        var status = (PersistenceStatus)Enum.Parse(typeof(PersistenceStatus), value.ToString(), true);
                        entity.PersistenceStatus = status;
                    }
                }
            }

            //可以使用 Json.NET 来遍历给实体属性赋值。
            //using (var jsonTextReader = new StringReader(strContent))
            //{
            //    var jsonSerializer = JsonSerializer.Create(this.SerializerSettings);
            //    jsonSerializer.Populate(jsonTextReader, entity);
            //}
        }
Example #28
0
 private static void CalculateCollectValue(Entity entity, IManagedProperty property, ManagedPropertyChangedEventArgs args)
 {
     var distance = Convert.ToDouble(args.NewValue) - Convert.ToDouble(args.OldValue);
     var oldValue = Convert.ToDouble(entity.GetProperty(property));
     entity.SetProperty(property, oldValue + distance);
 }
Example #29
0
    protected virtual void UpdateLookupTextProperty(object value)
    {
        var selectedItemText = lookupItems.SingleOrDefault(t => t.Value.Equals(value)).Text;

        Entity.SetProperty(TextPropertyName, selectedItemText);
    }
        /// <summary>
        /// 多选模式下的写值操作
        /// </summary>
        /// <param name="curEntity">正在编辑的实体。</param>
        /// <param name="svm">选择视图模型</param>
        /// <param name="selectedEntities">当前被选择的实体</param>
        private SetSelectionResult SyncSelectionToValue_Multiple(Entity curEntity, SelectionViewMeta rvm, IList<Entity> selectedEntities)
        {
            var result = string.Join(rvm.SplitterIfMulti, selectedEntities.Select(i => this.GetSelectedValue(i)));

            //赋值给this.PropertyValue
            this.PropertyValue = result;

            SetSelectionResult res = (this.PropertyValue as string) == result ? SetSelectionResult.Success : SetSelectionResult.Cancel;
            if (res == SetSelectionResult.Success)
            {
                //此时这个属性应该是一个 int 数组类型
                if (rvm.RefIdHost != null)
                {
                    var idArray = selectedEntities.Select(i => i.Id).ToArray();
                    curEntity.SetProperty(rvm.RefIdHost, idArray, ManagedPropertyChangedSource.FromUIOperating);
                }
            }

            return res;
        }
Example #31
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);
                //}
            }
        }
Example #32
0
        public void GiveExperienceToPlayer(RemotePlayer remotePlayer, Entity playerEntity, int amount)
        {
            if (!playerEntity.HasProperty((int)GameEntityPropertyEnum.Experience))
            {
                return;
            }

            var experience      = playerEntity.GetProperty((int)GameEntityPropertyEnum.Experience).IntValue;
            var level           = playerEntity.GetProperty((int)GameEntityPropertyEnum.Level).IntValue;
            var levelExperience = playerEntity.GetProperty((int)GameEntityPropertyEnum.LevelExperience).IntValue;

            var currentLevel           = level;
            var currentExperience      = experience;
            var currentLevelExperience = levelExperience;

            var experienceToDistribute = amount;

            while (experienceToDistribute > 0)
            {
                var toNextLevel = currentLevelExperience - currentExperience;

                if (experienceToDistribute >= toNextLevel)
                {
                    experienceToDistribute -= toNextLevel;
                    currentLevel++;
                    currentLevelExperience = _levelExperienceCalculator.GetLevelExperienceRequirement(level);
                    currentExperience      = 0;
                }
                else
                {
                    currentExperience     += experienceToDistribute;
                    experienceToDistribute = 0;
                }
            }

            if (experience != currentExperience)
            {
                playerEntity.SetProperty(new EntityProperty((int)GameEntityPropertyEnum.Experience, currentExperience));
            }

            if (levelExperience != currentLevelExperience)
            {
                playerEntity.SetProperty(new EntityProperty((int)GameEntityPropertyEnum.LevelExperience,
                                                            currentLevelExperience));
            }

            if (level != currentLevel)
            {
                playerEntity.SetProperty(new EntityProperty((int)GameEntityPropertyEnum.Level, currentLevel));
            }

            var xpMessage = new ServerPlayerXPIncrease {
                Amount = amount
            };

            _gameServer.Engine.SendMessageToClient(xpMessage, remotePlayer);

            if (currentLevel != level)
            {
                PlayerLevelUp(remotePlayer, currentLevel);
            }
        }
Example #33
0
        /// <summary>
        /// 遍历 JSON 对象的属性,并使用托管属性 API 来设置一般属性的值。
        /// </summary>
        /// <param name="jObject"></param>
        /// <param name="entity"></param>
        private void DeserializeProperties(JObject jObject, Entity entity)
        {
            var properties = entity.PropertiesContainer.GetAvailableProperties();

            foreach (var propertyValue in jObject)
            {
                var propertyName = propertyValue.Key;
                var jValue       = propertyValue.Value;
                var mp           = properties.Find(propertyName, true);
                if (mp != null)
                {
                    //只读属性不需要反序列化。
                    if (mp.IsReadOnly)
                    {
                        continue;
                    }
                    //幽灵属性也不需要处理。
                    if (mp == EntityConvention.Property_IsPhantom)
                    {
                        continue;
                    }

                    if (mp is IListProperty)
                    {
                        DeserializeList(entity, mp as IListProperty, jValue as JArray);
                    }
                    else if (mp is IRefEntityProperty)
                    {
                        //一般引用属性不支持反序列化。
                    }
                    //一般属性。
                    else
                    {
                        object value = null;

                        if (jValue is JArray)
                        {
                            #region 对于数组的泛型列表类型,需要进行特殊的处理。

                            var jArray       = jValue as JArray;
                            var propertyType = mp.PropertyType;
                            if (propertyType.IsArray)//string[]
                            {
                                var elementType = propertyType.GetElementType();
                                var array       = Array.CreateInstance(elementType, jArray.Count);
                                for (int i = 0, c = jArray.Count; i < c; i++)
                                {
                                    var itemTyped = TypeHelper.CoerceValue(elementType, jArray[i]);
                                    array.SetValue(itemTyped, i);
                                }
                                value = array;
                            }
                            else if (TypeHelper.IsGenericType(propertyType, typeof(List <>)))//List<string>
                            {
                                var elementType = propertyType.GetGenericArguments()[0];
                                var list        = Activator.CreateInstance(propertyType) as IList;
                                for (int i = 0, c = jArray.Count; i < c; i++)
                                {
                                    var itemTyped = TypeHelper.CoerceValue(elementType, jArray[i]);
                                    list.Add(itemTyped);
                                }
                                value = list;
                            }
                            else
                            {
                                //如果不是数组类型或者泛型列表类型的属性,则不支持反序列化。
                                //do nothing;
                            }

                            #endregion
                        }
                        else
                        {
                            value = (jValue as JValue).Value;

                            if (value is string)
                            {
                                var propertyType = mp.PropertyType;
                                if (propertyType == typeof(byte[]))
                                {
                                    value = Convert.FromBase64String(value as string);
                                }
                                else
                                {
                                    //兼容处理枚举的 Label 值。
                                    var innerType = TypeHelper.IgnoreNullable(propertyType);
                                    if (innerType.IsEnum)
                                    {
                                        value = EnumViewModel.LabelToEnum(value.ToString(), innerType);
                                    }
                                }
                            }
                        }

                        entity.SetProperty(mp, value, ManagedPropertyChangedSource.FromUIOperating);
                    }
                }
                else
                {
                    #region 处理:PersistenceStatus、TreeChildren

                    //PersistenceStatus:如果指定了状态,则主动设置该实体的状态。
                    if (propertyName.EqualsIgnoreCase(PersistenceStatusProperty))
                    {
                        var value  = (jValue as JValue).Value;
                        var status = (PersistenceStatus)Enum.Parse(typeof(PersistenceStatus), value.ToString(), true);
                        entity.PersistenceStatus = status;
                    }
                    //TreeChildren:如果指定了树子节点列表,则也需要加载进来。
                    else if (propertyName.EqualsIgnoreCase(AggtSerializer.TreeChildrenProperty))
                    {
                        var jArray = jValue as JArray;
                        if (jArray != null)
                        {
                            var treeChildren = entity.TreeChildren;
                            for (int i = 0, c = jArray.Count; i < c; i++)
                            {
                                var child = this.DeserializeEntity(entity.GetType(), jArray[i] as JObject);
                                treeChildren.LoadAdd(child);
                            }
                            treeChildren.MarkLoaded();
                        }
                    }

                    #endregion
                }
            }

            //可以使用 Json.NET 来遍历给实体属性赋值。
            //using (var jsonTextReader = new StringReader(strContent))
            //{
            //    var jsonSerializer = JsonSerializer.Create(this.SerializerSettings);
            //    jsonSerializer.Populate(jsonTextReader, entity);
            //}
        }
        /// <summary>
        /// 单选模式下的写值操作
        /// </summary>
        /// <param name="curEntity">正在编辑的实体。</param>
        /// <param name="svm">选择视图模型</param>
        /// <param name="selectedEntities">当前被选择的实体</param>
        private SetSelectionResult SyncSelectionToValue_Single(Entity curEntity, SelectionViewMeta svm, IList<Entity> selectedEntities)
        {
            bool success = false;

            //引用属性,应该先尝试设置实体属性,再设置 Id 属性。
            var rp = this.Meta.PropertyMeta.ManagedProperty as IRefProperty;
            if (selectedEntities.Count > 0)
            {
                var selectedEntity = selectedEntities[0] as Entity;
                if (rp != null)
                {
                    //如果 SelectedValuePath 是一个引用属性,或者直接就是一个实体属性,
                    //则应该获取相应的实体的值。
                    var valuePath = svm.SelectedValuePath;
                    if (valuePath != null)
                    {
                        if (valuePath is IRefProperty)
                        {
                            selectedEntity = selectedEntity.GetRefEntity((valuePath as IRefProperty).RefEntityProperty);
                        }
                        else if (rp.RefEntityType.IsAssignableFrom(valuePath.PropertyType))
                        {
                            selectedEntity = this.GetSelectedValue(selectedEntity) as Entity;
                        }
                    }

                    //设置实体到本引用属性上。
                    this.OnReferenceEntityChanging();
                    curEntity.SetRefEntity(rp.RefEntityProperty, selectedEntity, ManagedPropertyChangedSource.FromUIOperating);
                    success = curEntity.GetRefEntity(rp.RefEntityProperty) == selectedEntity;
                    if (success) { this.OnReferenceEntityChanged(); }
                }
                else
                {
                    var value = this.GetSelectedValue(selectedEntity);
                    this.PropertyValue = value;
                    success = this.PropertyValue == value;
                    if (success && svm.RefIdHost != null)
                    {
                        curEntity.SetProperty(svm.RefIdHost, selectedEntity.Id, ManagedPropertyChangedSource.FromUIOperating);
                    }
                }
            }
            else
            {
                if (rp != null)
                {
                    this.OnReferenceEntityChanging();
                    curEntity.SetRefEntity(rp.RefEntityProperty, null, ManagedPropertyChangedSource.FromUIOperating);
                    success = curEntity.GetRefEntity(rp.RefEntityProperty) == null;
                    if (success) { this.OnReferenceEntityChanged(); }
                }
                else
                {
                    this.PropertyValue = null;
                    success = this.PropertyValue == null;
                    if (success && svm.RefIdHost != null)
                    {
                        curEntity.SetProperty(svm.RefIdHost, null, ManagedPropertyChangedSource.FromUIOperating);
                    }
                }
            }

            return success ? SetSelectionResult.Success : SetSelectionResult.Cancel;
        }
Example #35
0
        /// <summary>
        /// Joins a existing list of entities with all the foreign tables defined
        /// in the Entity type
        /// </summary>
        /// <param name="entities">The list of entities</param>
        /// <param name="entity">The entity type</param>
        protected virtual void MergeData(List <Entity> entities, Entity entity)
        {
            List <Field> fields = entity.GetFields().FindAll(f => f.ForeignKey != null);

            foreach (Field field in fields)
            {
                ForeignKeyInfo fk   = field.ForeignKey;
                string         json = LoadFile(fk.TableName + ".txt");
                if (string.IsNullOrEmpty(json))
                {
                    continue;
                }
                IList <Entity> list = DeserializeEntityList(json);

                //TODO: implement RIGTH join
                for (int i = entities.Count - 1; i >= 0; i--)
                {
                    Entity ent = entities[i];

                    string joinfield = fk.JoinField.Replace("[", "").Replace("]", "").Trim();
                    Entity result    = ((List <Entity>)list).Find(item => item.GetProperty(joinfield).Equals(ent.GetProperty(field.Name)));

                    if (result == null && fk.Type == Field.FKType.Left) //LEFT
                    {
                        foreach (string jf in fk.JoinFields)
                        {
                            string name  = jf;
                            string value = "";

                            if (jf.IndexOf(" AS ") != -1)
                            {
                                string[] fieldAs = jf.Split(new string[] { " AS " }, StringSplitOptions.None);
                                if (fieldAs.Length == 2)
                                {
                                    name = fieldAs[1];
                                }
                            }

                            ent.SetProperty(name, value);
                        }
                    }
                    else if (result == null && fk.Type == Field.FKType.Inner) //INNER
                    {
                        entities.RemoveAt(i);
                    }
                    else
                    {
                        foreach (string jf in fk.JoinFields)
                        {
                            string name  = jf;
                            string value = result.GetProperty(jf);

                            if (jf.IndexOf(" AS ") != -1)
                            {
                                string[] fieldAs = jf.Split(new string[] { " AS " }, StringSplitOptions.None);
                                if (fieldAs.Length == 2)
                                {
                                    name  = fieldAs[1];
                                    value = result.GetProperty(fieldAs[0]);
                                }
                            }

                            ent.SetProperty(name, value);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 单选模式下的写值操作
        /// </summary>
        /// <param name="curEntity">正在编辑的实体。</param>
        /// <param name="svm">选择视图模型</param>
        /// <param name="selectedEntities">当前被选择的实体</param>
        private SetSelectionResult SyncSelectionToValue_Single(Entity curEntity, SelectionViewMeta svm, IList <Entity> selectedEntities)
        {
            bool success = false;

            //引用属性,应该先尝试设置实体属性,再设置 Id 属性。
            var rp = this.Meta.PropertyMeta.ManagedProperty as IRefProperty;

            if (selectedEntities.Count > 0)
            {
                var selectedEntity = selectedEntities[0] as Entity;
                if (rp != null)
                {
                    //如果 SelectedValuePath 是一个引用属性,或者直接就是一个实体属性,
                    //则应该获取相应的实体的值。
                    var valuePath = svm.SelectedValuePath;
                    if (valuePath != null)
                    {
                        if (valuePath is IRefProperty)
                        {
                            selectedEntity = selectedEntity.GetRefEntity((valuePath as IRefProperty).RefEntityProperty);
                        }
                        else if (rp.RefEntityType.IsAssignableFrom(valuePath.PropertyType))
                        {
                            selectedEntity = this.GetSelectedValue(selectedEntity) as Entity;
                        }
                    }

                    //设置实体到本引用属性上。
                    this.OnReferenceEntityChanging();
                    curEntity.SetRefEntity(rp.RefEntityProperty, selectedEntity, ManagedPropertyChangedSource.FromUIOperating);
                    success = curEntity.GetRefEntity(rp.RefEntityProperty) == selectedEntity;
                    if (success)
                    {
                        this.OnReferenceEntityChanged();
                    }
                }
                else
                {
                    var value = this.GetSelectedValue(selectedEntity);
                    this.PropertyValue = value;
                    success            = this.PropertyValue == value;
                    if (success && svm.RefIdHost != null)
                    {
                        curEntity.SetProperty(svm.RefIdHost, selectedEntity.Id, ManagedPropertyChangedSource.FromUIOperating);
                    }
                }
            }
            else
            {
                if (rp != null)
                {
                    this.OnReferenceEntityChanging();
                    curEntity.SetRefEntity(rp.RefEntityProperty, null, ManagedPropertyChangedSource.FromUIOperating);
                    success = curEntity.GetRefEntity(rp.RefEntityProperty) == null;
                    if (success)
                    {
                        this.OnReferenceEntityChanged();
                    }
                }
                else
                {
                    this.PropertyValue = null;
                    success            = this.PropertyValue == null;
                    if (success && svm.RefIdHost != null)
                    {
                        curEntity.SetProperty(svm.RefIdHost, null, ManagedPropertyChangedSource.FromUIOperating);
                    }
                }
            }

            return(success ? SetSelectionResult.Success : SetSelectionResult.Cancel);
        }