示例#1
0
        public IEntityTypeBuilder Initialize(IBindableModelBuilder modelBuilder, IEntityTypeBuilder publicEntityType)
        {
            var valueRuleBuilder = modelBuilder.CreateEntityTypeBuilder(FactonModelKeywords.ValueRuleEntityTypeName).WithParentType(publicEntityType);

            var valueRuleContainerBuilder = modelBuilder.CreateEntityTypeBuilder(FactonModelKeywords.ValueRuleContainerTypeName);

            publicEntityType.KeyProperties.ForEach(keyProperty => valueRuleContainerBuilder.WithKeyProperty(keyProperty));

            foreach (var valueProperty in this.GetDimensionDependingProperties())
            {
                var valueRuleProperty =
                    valueRuleContainerBuilder.CreateContainedNavigationProperty(valueRuleBuilder, valueProperty)
                    .WithMultiplicity(EdmMultiplicity.One, EdmMultiplicity.Many)
                    .WithSupportedOperations(Operation.Get | Operation.Post | Operation.Patch);

                var binding = new ConcreteValueRuleContainerNavigationPropertyBinding(
                    this.valueRuleService,
                    this.valueRuleMetadataService,
                    valueProperty);

                modelBuilder
                .WithBinding(valueRuleProperty, binding)
                .WithOptionalDependency(valueRuleProperty, publicEntityType.KeyProperties.First());
            }

            AddContainerNavigationProperty(modelBuilder, publicEntityType, valueRuleContainerBuilder);
            return(valueRuleContainerBuilder);
        }
 public ContainedCostSharpNavigationPropertyBuilder(
     IEntityTypeBuilder targetEntityTypeBuilder,
     IProperty sourceProperty,
     string sourcePropertyName)
     : base(targetEntityTypeBuilder, sourcePropertyName)
 {
     this.SourceProperty = sourceProperty;
 }
 public IEntitySetBuilder InitializeSet(
     IBindableModelBuilder modelBuilder,
     IEntityTypeBuilder entityTypeBuilder,
     ISignature signature,
     IEnumerable <string> entityTypes)
 {
     return(this.InitializeSet(modelBuilder, entityTypeBuilder, signature, entityTypes, string.Empty));
 }
示例#4
0
 public IUncontainedNavigationPropertyBuilder CreateUncontainedNavigationPropertyBuilder(
     IEntityTypeBuilder targetEntityTypeBuilder,
     IProperty sourceProperty)
 {
     return(new UncontainedCostSharpNavigationPropertyBuilder(
                targetEntityTypeBuilder,
                sourceProperty,
                this.modelItemNamingService.GetSafeEdmPropertyName(sourceProperty)));
 }
示例#5
0
        public IEntitySetBuilder CreateEntitySetBuilder(string name, IEntityTypeBuilder containedEntityTypeBuilder)
        {
            if (this.entitySetBuilders.ContainsKey(name))
            {
                throw new ArgumentException("Entity set builder already exists.", nameof(name));
            }

            return(this.entitySetBuilders[name] = new EntitySetBuilder(name, containedEntityTypeBuilder, this.edmModelUnderConstruction));
        }
		public DynamicAssemblyManager(DynamicAssembly dynamicAssembly)
		{
			_dynamicAssembly = dynamicAssembly;

			_entityTypeBuilder = new EntityTypeBuilder(dynamicAssembly);
			_mappingTypeBuilder = new MappingTypeBuilder(dynamicAssembly);

			// TODO: should this use Thread.GetDomain()??
			AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
		}
示例#7
0
        private IReadOnlyDictionary <string, IStructuralProperty> GetEffectiveKeyProperties()
        {
            IEntityTypeBuilder entityType = this;

            while (entityType.KeyProperties.IsEmpty())
            {
                entityType = entityType.ParentTypeBuilder;
            }

            return(entityType.KeyProperties.ToDictionary(p => p.EdmPropertyName, p => p));
        }
示例#8
0
        public IContainedNavigationPropertyBuilder CreateContainedNavigationProperty(IEntityTypeBuilder targetTypeBuilder, IProperty propertyName)
        {
            this.ThrowIfAlreadyBuilt();

            var builder = this.navigationPropertyBuilderFactory.CreateContainedNavigationPropertyBuilder(targetTypeBuilder, propertyName);

            this.ThrowIfDuplicatePropertyName(builder.SourcePropertyName);
            this.navigationPropertyBuilders.Add(builder.SourcePropertyName, builder);

            return(builder);
        }
示例#9
0
 private static void AddContainerNavigationProperty(
     IBindableModelBuilder modelBuilder,
     IEntityTypeBuilder publicEntityType,
     IEntityTypeBuilder containerEntityType)
 {
     modelBuilder.WithBinding(
         publicEntityType.CreateContainedNavigationProperty(containerEntityType, FactonModelKeywords.ValueRuleContainerNavigationPropertyName)
         .WithMultiplicity(EdmMultiplicity.One, EdmMultiplicity.One)
         .WithSupportedOperations(Operation.Get),
         new VirtualValueRuleContainerNavigationPropertyBinding());
 }
示例#10
0
        private void InitializeSignatureTypes(IBindableModelBuilder modelBuilder, IEntityTypeBuilder publicEntityTypeBuilder)
        {
            // create one entity type per every registered FACTON signature type
            foreach (var signatureType in this.configurationRegistry.RegisteredSignatureTypeConfigurations)
            {
                var initializer =
                    this.entityTypeInitializerRegistry.GetAll()
                    .OfType <ISignatureTypeInitializer>()
                    .FirstOrDefault(i => i.CanHandleSignatureType(signatureType));

                initializer?.Initialize(signatureType, modelBuilder, publicEntityTypeBuilder);
            }
        }
示例#11
0
        private IReadOnlyDictionary <string, IStructuralProperty> GetEffectiveProperties()
        {
            var effectiveProperties       = new Dictionary <string, IStructuralProperty>();
            IEntityTypeBuilder entityType = this;

            do
            {
                entityType.Properties.ForEach(property => effectiveProperties[property.EdmPropertyName] = property);
                entityType = entityType.ParentTypeBuilder;
            }while (entityType != null);

            return(effectiveProperties);
        }
示例#12
0
 private static void RegisterVersionedEntityNavigationProperty(
     IBindableModelBuilder modelBuilder,
     IEntityTypeBuilder versionInfoTypeBuilder,
     IEntityTypeBuilder publicEntityTypeBuilder)
 {
     modelBuilder.WithBinding(
         versionInfoTypeBuilder.CreateContainedNavigationProperty(
             publicEntityTypeBuilder,
             FactonModelKeywords.VersionedEntityNavigationPropertyName)
         .WithMultiplicity(EdmMultiplicity.One, EdmMultiplicity.One)
         .WithSupportedOperations(Operation.Get),
         new VersionedEntityNavigationPropertyBinding());
 }
        public IEntitySetBuilder InitializeSet(
            IBindableModelBuilder modelBuilder,
            IEntityTypeBuilder entityTypeBuilder,
            ISignature signature,
            IEnumerable <string> entityTypes,
            string space)
        {
            var entitySetBuilder =
                modelBuilder.CreateEntitySetBuilder(this.GetSetName(signature), entityTypeBuilder)
                .WithSupportedOperations(Operation.Get | Operation.Post | Operation.Patch);

            modelBuilder.WithBinding(entitySetBuilder, this.CreateEntitySetBinding(signature, entityTypes, space));
            return(entitySetBuilder);
        }
        public IEntityTypeBuilder Initialize(
            SignatureTypeConfiguration config,
            IBindableModelBuilder modelBuilder,
            IEntityTypeBuilder publicEntityType)
        {
            var typeBuilder = modelBuilder.CreateEntityTypeBuilder(config.SignatureType).WithParentType(publicEntityType);

            foreach (var signature in this.signatureSetInitializer.GetRelevantSignaturesByType(config.SignatureType))
            {
                this.signatureSetInitializer.InitializeSingleton(
                    modelBuilder, typeBuilder, signature, config.RelevantEntityTypes, "GlobalMasterData");
            }

            return(typeBuilder);
        }
        /// <summary>
        /// Determines whether this entity type is derived from or is equal to the the specified parent entity type.
        /// </summary>
        /// <param name="entityTypeBuilder">The derived entity type builder.</param>
        /// <param name="parentEntityTypeBuilder">The parent entity type builder.</param>
        public static bool IsDerivedFrom(this IEntityTypeBuilder entityTypeBuilder, IEntityTypeBuilder parentEntityTypeBuilder)
        {
            var parent = entityTypeBuilder.ParentTypeBuilder;

            while (parent != null)
            {
                if (parent.Equals(parentEntityTypeBuilder))
                {
                    return(true);
                }

                parent = parent.ParentTypeBuilder;
            }

            return(false);
        }
示例#16
0
        /// <summary>
        /// Fluent Mapping
        /// </summary>
        /// <param name="entityTypeBuilderTypes"></param>
        public static void UseBuilders(params Type[] entityTypeBuilderTypes)
        {
            if (entityTypeBuilderTypes == null)
            {
                return;
            }

            List <TypeDefinition> typeDefinitions = new List <TypeDefinition>(entityTypeBuilderTypes.Length);

            foreach (Type entityTypeBuilderType in entityTypeBuilderTypes)
            {
                IEntityTypeBuilder entityTypeBuilder = Activator.CreateInstance(entityTypeBuilderType) as IEntityTypeBuilder;
                typeDefinitions.Add(entityTypeBuilder.EntityType.MakeDefinition());
            }

            Configure(typeDefinitions.ToArray());
        }
        public IEntityTypeBuilder Initialize(
            SignatureTypeConfiguration config,
            IBindableModelBuilder modelBuilder,
            IEntityTypeBuilder publicEntityType)
        {
            var typeBuilder = modelBuilder.CreateEntityTypeBuilder(config.SignatureType).WithParentType(publicEntityType);

            var versionInfoTypeBuilder = this.versionInfoTypeInitializer.GetOrCreateVersionInfoType(modelBuilder, publicEntityType);

            this.versionInfoTypeInitializer.InitializeVersionsNavigationProperty(modelBuilder, typeBuilder, versionInfoTypeBuilder);

            foreach (var signature in this.signatureSetInitializer.GetRelevantSignaturesByType(config.SignatureType))
            {
                this.signatureSetInitializer.InitializeSet(modelBuilder, typeBuilder, signature, config.RelevantEntityTypes);
            }

            return(typeBuilder);
        }
        public IEntitySetBuilder InitializeSingleton(
            IBindableModelBuilder modelBuilder,
            IEntityTypeBuilder entityTypeBuilder,
            ISignature signature,
            IEnumerable <string> entityTypes,
            string space)
        {
            var singletonBuilder =
                modelBuilder.CreateEntitySetBuilder(this.GetSetName(signature), entityTypeBuilder)
                .AsSingleton()
                .WithSupportedOperations(Operation.Get | Operation.Patch);

            modelBuilder.WithBinding(
                singletonBuilder,
                new SignatureSingletonBinding(this.factonQueryService, this.queryBuilderFactory, signature, entityTypes, space));

            return(singletonBuilder);
        }
示例#19
0
        public static TypeDescriptor GetDescriptor(Type type)
        {
            PublicHelper.CheckNull(type, nameof(type));

            TypeDescriptor instance;

            if (!InstanceCache.TryGetValue(type, out instance))
            {
                lock (type)
                {
                    if (!InstanceCache.TryGetValue(type, out instance))
                    {
                        IEntityTypeBuilder entityTypeBuilder = Activator.CreateInstance(typeof(InternalEntityTypeBuilder <>).MakeGenericType(type)) as IEntityTypeBuilder;
                        instance = new TypeDescriptor(entityTypeBuilder.EntityType.MakeDefinition());
                        InstanceCache.GetOrAdd(type, instance);
                    }
                }
            }

            return(instance);
        }
示例#20
0
        private void ThrowIfDuplicatePropertiesInHierarchy()
        {
            var names = new HashSet <string>();
            IEntityTypeBuilder typeBuilder = this;

            while (typeBuilder != null)
            {
                foreach (var keyProperty in typeBuilder.KeyProperties.Select(p => p.EdmPropertyName))
                {
                    if (names.Contains(keyProperty))
                    {
                        throw new InvalidOperationException("Key property " + keyProperty + " is already contained in one of the parent types.");
                    }
                    names.Add(keyProperty);
                }

                foreach (var property in typeBuilder.Properties.Select(p => p.EdmPropertyName))
                {
                    if (names.Contains(property))
                    {
                        throw new InvalidOperationException("Property " + property + " is already contained in one of the parent types.");
                    }
                    names.Add(property);
                }

                foreach (var navigationProperty in typeBuilder.NavigationPropertyBuilders.Select(n => n.SourcePropertyName))
                {
                    if (names.Contains(navigationProperty))
                    {
                        throw new InvalidOperationException("Property " + navigationProperty + " is already contained in one of the parent types.");
                    }
                    names.Add(navigationProperty);
                }

                typeBuilder = typeBuilder.ParentTypeBuilder;
            }
        }
示例#21
0
        private void AddTreePropertiesToPublicEntityType(
            ISignature treeSignature,
            IBindableModelBuilder modelBuilder,
            IEntityTypeBuilder dataTreeType,
            IEntityTypeBuilder publicEntityType)
        {
            foreach (var property in this.propertyService.GetSelectionTreePropertiesByTreeSignature(treeSignature))
            {
                modelBuilder.WithBinding(
                    publicEntityType.CreateUncontainedNavigationProperty(dataTreeType, property)
                    .WithMultiplicity(EdmMultiplicity.One, EdmMultiplicity.One)
                    .WithSupportedOperations(Operation.Get),
                    new SelectionTreeValueNavigationPropertyBinding(property));
            }

            foreach (var property in this.propertyService.GetSelectionTreeValueListPropertiesByTreeSignature(treeSignature))
            {
                modelBuilder.WithBinding(
                    publicEntityType.CreateUncontainedNavigationProperty(dataTreeType, property)
                    .WithMultiplicity(EdmMultiplicity.One, EdmMultiplicity.Many)
                    .WithSupportedOperations(Operation.Get),
                    new SelectionTreeValueListValueNavigationPropertyBinding(property));
            }
        }
示例#22
0
        public IEntityTypeBuilder Initialize(
            SignatureTypeConfiguration config,
            IBindableModelBuilder modelBuilder,
            IEntityTypeBuilder publicEntityType)
        {
            var dataTreeTypeBuilder = modelBuilder.CreateEntityTypeBuilder(config.SignatureType).WithParentType(publicEntityType);
            var parentProperty      =
                dataTreeTypeBuilder.CreateUncontainedNavigationProperty(dataTreeTypeBuilder, FactonModelKeywords.TreeNodeParentNavigationPropertyName)
                .WithMultiplicity(EdmMultiplicity.Many, EdmMultiplicity.One)
                .WithSupportedOperations(Operation.Get);

            modelBuilder.WithBinding(parentProperty, new TreeNodeParentNavigationPropertyBinding());

            foreach (var signature in this.signatureSetInitializer.GetRelevantSignaturesByType(config.SignatureType))
            {
                var setBuilder =
                    this.signatureSetInitializer.InitializeSet(
                        modelBuilder, dataTreeTypeBuilder, signature, config.RelevantEntityTypes, this.space)
                    .WithUncontainedNavigationPropertySelfTarget(parentProperty);

                IEntitySetBinding existingBinding;
                if (!modelBuilder.TryGetBinding(setBuilder, out existingBinding))
                {
                    throw new InvalidOperationException("No existing binding found for tree node entity set.");
                }

                modelBuilder
                .WithBinding(setBuilder, new TreeNodeEntitySetBinding(existingBinding))
                .WithDependency(setBuilder, parentProperty)
                .WithOptionalDependency(setBuilder, publicEntityType.KeyProperties.First());

                this.AddTreePropertiesToPublicEntityType(signature, modelBuilder, dataTreeTypeBuilder, publicEntityType);
            }

            return(dataTreeTypeBuilder);
        }
        public static IEnumerable <INavigationPropertyBuilder> GetEffectiveNavigationProperties(this IEntityTypeBuilder entityTypeBuilder)
        {
            var navigationProperties = new List <INavigationPropertyBuilder>();

            do
            {
                navigationProperties.AddRange(entityTypeBuilder.NavigationPropertyBuilders);
                entityTypeBuilder = entityTypeBuilder.ParentTypeBuilder;
            }while (entityTypeBuilder != null);

            return(navigationProperties);
        }
示例#24
0
        private void AddDataTreePropertyNavigationTargets(IModelBuilder modelBuilder, IEntityTypeBuilder publicEntityType)
        {
            var entitySetsOfPublicEntityType =
                modelBuilder.EntitySetBuilders.Where(entitySet => entitySet.ContainedEntityType.IsDerivedFrom(publicEntityType)).ToArray();

            foreach (var navigationProperty in publicEntityType.NavigationPropertyBuilders.OfType <IUncontainedNavigationPropertyBuilder>())
            {
                IEntitySetBuilder targetEntitySet;
                if (this.TryGetDataTreeTargetEntitySet(navigationProperty, modelBuilder, out targetEntitySet))
                {
                    entitySetsOfPublicEntityType.ForEach(s => s.WithUncontainedNavigationPropertyTarget(navigationProperty, targetEntitySet));
                }
            }
        }
示例#25
0
 public void PerformPostProcessing(IModelBuilder modelBuilder, IEntityTypeBuilder publicEntityType)
 {
     this.AddDataTreePropertyNavigationTargets(modelBuilder, publicEntityType);
 }
示例#26
0
 public IEntityTypeBuilder Initialize(SignatureTypeConfiguration config, IBindableModelBuilder modelBuilder, IEntityTypeBuilder publicEntityType)
 {
     throw new NotImplementedException();
 }
示例#27
0
 public bool TryGetEntityTypeBuilder(string name, out IEntityTypeBuilder entityTypeBuilder)
 => this.underlyingModelBuilder.TryGetEntityTypeBuilder(name, out entityTypeBuilder);
示例#28
0
 public bool TryGetEntityTypeBuilder(string name, out IEntityTypeBuilder entityTypeBuilder)
 {
     return(this.entityTypeBuilders.TryGetValue(name, out entityTypeBuilder));
 }
示例#29
0
 private void PerformPostProcessing(IModelBuilder modelBuilder, IEntityTypeBuilder publicEntityTypeBuilder)
 {
     this.entityTypeInitializerRegistry.GetAll()
     .OfType <IPostProcessor>()
     .ForEach(p => p.PerformPostProcessing(modelBuilder, publicEntityTypeBuilder));
 }
示例#30
0
 protected NavigationPropertyBuilderBase(IEntityTypeBuilder targetEntityTypeBuilder, string sourcePropertyName)
 {
     this.TargetEntityTypeBuilder = targetEntityTypeBuilder;
     this.SourcePropertyName      = sourcePropertyName;
 }
示例#31
0
 public IEntitySetBuilder CreateEntitySetBuilder(string name, IEntityTypeBuilder containedEntityTypeBuilder)
 => this.underlyingModelBuilder.CreateEntitySetBuilder(name, containedEntityTypeBuilder);