示例#1
0
文件: Layer.cs 项目: bazer/Modl
        //internal IEnumerable<Property> ForeignKeys
        //{
        //    get
        //    {
        //        return Properties.Where(x => x.IsForeignKey);
        //    }
        //}

        internal void SetValuesFromStorage(Backer instance, IEnumerable <Container> storage)
        {
            //if (HasParent)
            //    Parent.SetValuesFromStorage(instance, storage);

            foreach (var value in storage.Single(x => x.About.Type == ModlName).Values)
            {
                var property = GetPropertyFromModlName(value.Key);

                if (property.IsId)
                {
                    continue;
                }

                if (property.IsLink)
                {
                    var linkedDefinition = Definitions.Get((property as LinkProperty).LinkedModlType);
                    var linkIdType       = linkedDefinition.HasIdProperty ? linkedDefinition.IdProperty.PropertyType : typeof(Guid);
                    var newValue         = Materializer.DeserializeObject(value.Value, typeof(List <>).MakeGenericType(linkIdType), Settings.Get(Type));

                    var list = ((IEnumerable)newValue).Cast <object>();
                    instance.GetRelation(property.PropertyName).Set(list.Select(x => Identity.FromId(x, linkedDefinition)));
                }
                else
                {
                    var newValue = value.Value;

                    if (value.Value != null && !property.PropertyType.IsInstanceOfType(value.Value))
                    {
                        newValue = Materializer.DeserializeObject(value.Value, property.PropertyType, Settings.Get(Type));
                    }

                    instance.SetValue(property.PropertyName, newValue);
                }
            }
        }