示例#1
0
        public void LoadFromXml(XmlDocument document)
        {
            XmlNodeList nodes = document.SelectNodes(string.Format("/Repositories/Repository/Items/{0}", ContentsType.Name));

            foreach (XmlNode node in nodes)
            {
                T item            = Create();
                PropertyInfo[] pi = ContentsType.GetProperties();
                foreach (XmlNode propName in node.ChildNodes)
                {
                    PropertyInfo p = pi.FirstOrDefault(x => x.Name == propName.Name);
                    if (p != null)
                    {
                        string refType = propName.AttributeValueOrDefault("From");
                        if (string.IsNullOrEmpty(refType))
                        {
                            object value;
                            if (p.PropertyType.IsEnum)
                            {
                                value = Enum.Parse(p.PropertyType, propName.InnerText);
                            }
                            else
                            {
                                value = Convert.ChangeType(propName.InnerText, p.PropertyType);
                            }

                            p.SetValue(item, value, null);
                        }
                        else
                        {
                            IPropertyRepository repo = owner.Get(refType);
                            Entity e = repo.Objects.OfType <Entity>().FirstOrDefault(x => x.Key() == propName.InnerText);
                            p.SetValue(item, e, null);
                        }
                    }
                }

                Add(item);
            }
        }
示例#2
0
        /// <summary>
        /// Метод вызывается при удалении объекта из какой-либо коллекции и предназначен
        /// обновления зависимых объектов (объектов помеченых атрибутом DependenceAttribute).
        /// </summary>
        /// <param name="removingItem">Удаляемый объект.</param>
        void RemoveDependence(Entity removingItem)
        {
            IDictionary <PropertyInfo, DependenceAttribute> properties = ContentsType.GetProperties <DependenceAttribute>();

            if (properties.Count == 0)
            {
                return;
            }

            foreach (T item in ItemsWithoutFilters)
            {
                foreach (PropertyInfo p in properties.Keys)
                {
                    object propValue = p.GetValue(item, null);
                    if (propValue == null)
                    {
                        continue;
                    }

                    if (propValue.GetType().GetInterface("IList") != null)
                    {
                        IList list  = (IList)propValue;
                        Stack stack = new Stack();
                        foreach (object obj in list)
                        {
                            if (ReferenceEquals(obj, removingItem))
                            {
                                if (properties[p].Action == DependenceAction.Nothing)
                                {
                                    throw new RepositoryException(string.Format(Strings.DeleteEntityError, removingItem.ToString(), item.ToString()), RepoErrors.EntityDependenceError, removingItem);
                                }
                                else
                                {
                                    stack.Push(obj);
                                }
                            }
                            else
                            {
                                Entity entity = obj as Entity;
                                if (entity != null)
                                {
                                    if (entity.ContainsObject(removingItem))
                                    {
                                        if (properties[p].Action == DependenceAction.Nothing)
                                        {
                                            throw new RepositoryException(string.Format(Strings.DeleteEntityError, removingItem.ToString(), item.ToString()), RepoErrors.EntityDependenceError, removingItem);
                                        }
                                        else
                                        {
                                            stack.Push(obj);
                                        }
                                    }
                                }
                            }
                        }

                        if (stack.Count > 0)
                        {
                            while (stack.Count > 0)
                            {
                                list.Remove(stack.Pop());
                            }

                            UpdateObjectInternal(item, ObjectAction.Modify);
                        }
                    }
                    else
                    {
                        if (ReferenceEquals(propValue, removingItem))
                        {
                            switch (properties[p].Action)
                            {
                            case DependenceAction.SetNull:
                                p.SetValue(item, null, null);
                                owner.Get <T>().Update(item);
                                break;

                            case DependenceAction.Delete:
                                owner.Get <T>().Remove(item);
                                break;

                            case DependenceAction.Nothing:
                                throw new RepositoryException(string.Format(Strings.DeleteEntityError, removingItem.ToString(), item.ToString()), RepoErrors.EntityDependenceError, removingItem);

                            default:
                                throw new Exception("Invalid value for DependenceAction");
                            }
                        }
                    }
                }
            }
        }