/// <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); }
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); } } }
/// <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); }