Exemplo n.º 1
0
        /// <summary>
        /// Create a one to many navigation.
        /// Find informations and create the one to many proxy property mapped to the type property of entity.
        /// </summary>
        /// <param name="typeBuilder"></param>
        /// <param name="proxyType"></param>
        /// <param name="proxyNavProp"></param>
        /// <param name="navWorkshopResult"></param>
        private void CreateOneToManyNavigation(TypeBuilder typeBuilder, Type proxyType,
                                               PropertyInfo proxyNavProp,
                                               NavigationPropertyWorkshop.Result navWorkshopResult)
        {
            var navPropertyBuilder = navWorkshopResult.OneToMany.Where(c => c.Key.ManyNavigationName == GetEntityPropName(proxyNavProp))
                                     .SingleOrDefault();

            if (navPropertyBuilder.Equals(default(KeyValuePair <Models.Relationship, PropertyBuilder>)))
            {
                throw new MetaDataException("There are no metadata to describe '" +
                                            GetEntityPropName(proxyNavProp) +
                                            "' one to many relationship as expected in '" +
                                            proxyType.FullName +
                                            "' proxy");
            }

            NavigationInfo proxyNavInfo = new NavigationInfo()
            {
                DeclaringType  = proxyType,
                NavigationType = proxyNavProp.PropertyType,
                PropertyName   = proxyNavProp.Name
            };

            NavigationInfo entityNavInfo = new NavigationInfo()
            {
                DeclaringType  = navPropertyBuilder.Value.DeclaringType,
                NavigationType = navPropertyBuilder.Value.PropertyType,
                PropertyName   = GetEntityPropName(proxyNavProp),
                GetMethod      = navPropertyBuilder.Value.GetGetMethod(),
                SetMethod      = navPropertyBuilder.Value.GetSetMethod()
            };

            CreateOneToManyProperty(typeBuilder, proxyNavInfo, entityNavInfo);
        }
Exemplo n.º 2
0
        private void CreateBindedNavigations(TypeBuilder typeBuilder, Models.Proxy proxy,
                                             NavigationPropertyWorkshop.Result navWorkshopResult)
        {
            var proxyType = Type.GetType(proxy.FullyQualifiedTypeName);

            var proxyNavProperties = proxyType.GetProperties()
                                     .Where(prop => Attribute.IsDefined(prop, typeof(BindedNavigationPropertyAttribute)));

            foreach (var proxyNavProp in proxyNavProperties)
            {
                if (proxyNavProp.PropertyType.Name == typeof(ICollection <>).Name)
                {
                    // One to many
                    CreateOneToManyNavigation(typeBuilder, proxyType, proxyNavProp, navWorkshopResult);
                }
                else
                {
                    // Many to one
                    CreateManyToOneNavigation(typeBuilder, proxyType, proxyNavProp, navWorkshopResult);
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Create one to many navigation.
        /// Find informations and create the many to one proxy property <see cref="Materials.BindingCollection{TOutput, TInput}"/>
        /// </summary>
        /// <param name="typeBuilder"></param>
        /// <param name="proxyType"></param>
        /// <param name="proxyNavProp"></param>
        /// <param name="navWorkshopResult"></param>
        private void CreateManyToOneNavigation(TypeBuilder typeBuilder, Type proxyType, PropertyInfo proxyNavProp,
                                               NavigationPropertyWorkshop.Result navWorkshopResult)
        {
            var navPropertyBuilder = navWorkshopResult.ManyToOne.Where(c => c.Key.OneNavigationName == GetEntityPropName(proxyNavProp)).Single();

            NavigationInfo proxyNavInfo = new NavigationInfo()
            {
                DeclaringType  = proxyType,
                NavigationType = proxyNavProp.PropertyType,
                PropertyName   = proxyNavProp.Name
            };

            NavigationInfo entityNavInfo = new NavigationInfo()
            {
                DeclaringType  = navPropertyBuilder.Value.DeclaringType,
                NavigationType = navPropertyBuilder.Value.PropertyType,
                PropertyName   = GetEntityPropName(proxyNavProp),
                GetMethod      = navPropertyBuilder.Value.GetMethod,
                SetMethod      = navPropertyBuilder.Value.SetMethod
            };

            CreateManyToOneProperty(typeBuilder, proxyNavInfo, entityNavInfo);
        }