Beispiel #1
0
        public void Build(EntityTypeInfo typeInfo)
        {
            foreach ((PropertyInfo many, PropertyInfo join) in GetManyToManyInfo(_metadataProvider, typeInfo.ClrType))
            {
                if (many == null || many.DeclaringType != typeInfo.ClrType)
                {
                    continue;
                }

                IEdmNavigationProperty joinNavigationProperty = GetJoinNavigationProperty(typeInfo, join.DeclaringType);
                if (joinNavigationProperty == null)
                {
                    continue;
                }

                EntityTypeInfo principalInfo = _entityTypeInfos[join.PropertyType];
                EntityTypeInfo dependentInfo = _entityTypeInfos[many.DeclaringType];

                var edmDependentInfo = new EdmNavigationPropertyInfo()
                {
                    ContainsTarget      = true,
                    Name                = many.Name,
                    OnDelete            = EdmOnDeleteAction.None,
                    PrincipalProperties = principalInfo.EdmType.DeclaredKey,
                    Target              = principalInfo.EdmType,
                    TargetMultiplicity  = EdmMultiplicity.Many
                };
                IEdmNavigationProperty edmManyToManyProperty;
                if (typeInfo.ClrType.GetProperty(many.Name) == null)
                {
                    IEdmNavigationProperty edmNavigationProperty = EdmNavigationProperty.CreateNavigationProperty(dependentInfo.EdmType, edmDependentInfo);
                    edmManyToManyProperty = new OeEdmNavigationShadowProperty(edmNavigationProperty, many);
                    dependentInfo.EdmType.AddProperty(edmManyToManyProperty);
                }
                else
                {
                    edmManyToManyProperty = dependentInfo.EdmType.AddUnidirectionalNavigation(edmDependentInfo);
                }

                var targetNavigationProperty  = (IEdmNavigationProperty)_entityTypeInfos[join.DeclaringType].EdmType.GetPropertyIgnoreCase(join.Name);
                var manyToManyJoinDescription = new ManyToManyJoinDescription(join.DeclaringType, joinNavigationProperty, targetNavigationProperty);
                _edmModel.SetAnnotationValue(edmManyToManyProperty, manyToManyJoinDescription);
            }
        }
Beispiel #2
0
        public void Build(EntityTypeInfo typeInfo)
        {
            (PropertyInfo Many, PropertyInfo Join)manyToManyInfo = GetManyToManyInfo(_metadataProvider, typeInfo.ClrType);
            if (manyToManyInfo.Many == null)
            {
                return;
            }

            IEdmNavigationProperty joinNavigationProperty = GetJoinNavigationProperty(typeInfo, manyToManyInfo.Join.DeclaringType);

            if (joinNavigationProperty == null)
            {
                return;
            }

            IEdmNavigationProperty targetNavigationProperty = GetTargetNavigationProperty(_entityTypeInfos[manyToManyInfo.Join.DeclaringType], manyToManyInfo.Join.PropertyType);

            if (targetNavigationProperty == null)
            {
                return;
            }

            EntityTypeInfo principalInfo    = _entityTypeInfos[manyToManyInfo.Join.PropertyType];
            EntityTypeInfo dependentInfo    = _entityTypeInfos[manyToManyInfo.Many.DeclaringType];
            var            edmDependentInfo = new EdmNavigationPropertyInfo()
            {
                ContainsTarget      = true,
                Name                = manyToManyInfo.Many.Name,
                OnDelete            = EdmOnDeleteAction.None,
                PrincipalProperties = principalInfo.EdmType.DeclaredKey,
                Target              = principalInfo.EdmType,
                TargetMultiplicity  = EdmMultiplicity.Many
            };
            EdmNavigationProperty edmManyToManyProperty = dependentInfo.EdmType.AddUnidirectionalNavigation(edmDependentInfo);

            var manyToManyJoinDescription = new ManyToManyJoinDescription(manyToManyInfo.Join.DeclaringType, joinNavigationProperty, targetNavigationProperty);

            _edmModel.SetAnnotationValue(edmManyToManyProperty, manyToManyJoinDescription);
        }