private static EntityType GetOrCreateEntityType(
            Type type,
            ModelConfiguration modelConfiguration,
            BreezeMetadata metadata)
        {
            if (metadata.StructuralTypes.FirstOrDefault(o => o.Type == type) is EntityType entityType)
            {
                return(entityType);
            }

            entityType = new EntityType(type)
            {
                DefaultResourceName  = modelConfiguration.ResourceName,
                AutoGeneratedKeyType = AutoGeneratedKeyType.KeyGenerator,
                Custom = modelConfiguration.Custom
            };

            if (entityType.DefaultResourceName != null)
            {
                metadata.ResourceEntityTypeMap.Add(modelConfiguration.ResourceName, GetBreezeTypeFullName(type));
            }

            metadata.StructuralTypes.Add(entityType);

            return(entityType);
        }
        private void AddComplexType(
            IAbstractComponentType componentType,
            ModelConfiguration modelConfiguration,
            BreezeMetadata metadata,
            bool partOfKey,
            ISessionFactoryImplementor sessionFactory)
        {
            var type = componentType.ReturnedClass;

            if (!_addedTypes.Add(type))
            {
                return;
            }

            var complexType = new ComplexType(type)
            {
                Custom = modelConfiguration.Custom
            };

            AddDataProperties(
                componentType.PropertyNames,
                componentType.Subtypes,
                componentType.PropertyNullability,
                null,
                null,
                partOfKey,
                complexType,
                modelConfiguration,
                metadata,
                sessionFactory);

            // Add complex types at the beginning of the list
            metadata.StructuralTypes.Insert(0, complexType);
        }
        private void AddComplexType(Type type, BreezeMetadata metadata)
        {
            if (!_addedTypes.Add(type))
            {
                return;
            }

            var modelConfiguration = _breezeConfigurator.GetModelConfiguration(type);
            var complexType        = new ComplexType(type)
            {
                Custom = modelConfiguration.Custom
            };

            foreach (var property in type.GetProperties())
            {
                if (!_dataTypeProvider.TryGetDataType(property.PropertyType, out var dataType))
                {
                    continue;
                }

                complexType.DataProperties.Add(
                    CreateDataProperty(
                        property.Name,
                        dataType,
                        false,
                        IsNullable(property.PropertyType),
                        false,
                        modelConfiguration.GetMember(property.Name),
                        complexType,
                        null));
            }

            // Add complex types at the beginning of the list
            metadata.StructuralTypes.Insert(0, complexType);
        }
        private void AddProperties(
            EntityMetadata entityMetadata,
            EntityType entityType,
            ModelConfiguration modelConfiguration,
            BreezeMetadata metadata)
        {
            var persister = entityMetadata.EntityPersister;

            AddDataProperties(
                persister.PropertyNames,
                persister.PropertyTypes,
                persister.PropertyNullability,
                entityMetadata.DerivedPropertyNames,
                persister.VersionProperty,
                false,
                entityType,
                modelConfiguration,
                metadata,
                persister.Factory);
            AddIdentifierProperties(persister, entityType, modelConfiguration, entityMetadata, metadata);
            AddSyntheticMembers(entityType, modelConfiguration);
            AddSyntheticForeignKeyProperties(entityMetadata, entityType, modelConfiguration);
            AddIncludedMembers(entityType, modelConfiguration, entityMetadata);

            // We do the association properties after the data properties, so we can do the foreign key lookups
            AddAssociationProperties(
                persister.PropertyNames,
                persister.PropertyTypes,
                false,
                i => persister.PropertyCascadeStyles[i],
                entityType,
                entityMetadata.DerivedPropertyNames,
                modelConfiguration,
                entityMetadata);
        }
 public NorthwindIBModelController(
     ISession session,
     NorthwindPersistenceManager persistenceManager,
     BreezeMetadata metadata)
 {
     _session            = session;
     _persistenceManager = persistenceManager;
     _metadata           = metadata;
 }
Exemplo n.º 6
0
 public BreezeController(
     ISession session,
     PersistenceManager persistenceManager,
     BreezeMetadata metadata)
 {
     _session            = session;
     _persistenceManager = persistenceManager;
     _metadata           = metadata;
 }
 public MultipleDatabaseController(
     PersistenceManager persistenceManager,
     BreezeMetadata metadata,
     BarSession barSession,
     FooSession fooSession)
 {
     _persistenceManager = persistenceManager;
     _metadata           = metadata;
     _barSession         = barSession;
     _fooSession         = fooSession;
 }
        private void AddIdentifierProperties(
            AbstractEntityPersister persister,
            EntityType entityType,
            ModelConfiguration modelConfiguration,
            EntityMetadata entityMetadata,
            BreezeMetadata metadata)
        {
            // Add the identifier properties only for the root class
            if (persister.IsInherited)
            {
                return;
            }

            if (persister.HasIdentifierProperty)
            {
                var memberConfiguration = modelConfiguration.GetMember(persister.IdentifierPropertyName);
                var dataProperty        = CreateDataProperty(
                    persister.IdentifierPropertyName,
                    persister.IdentifierType,
                    true,
                    false,
                    false,
                    memberConfiguration,
                    entityType,
                    persister.Factory);
                entityType.DataProperties.Insert(0, dataProperty);
            }
            else if (persister.IdentifierType is IAbstractComponentType componentType)
            {
                modelConfiguration = _breezeConfigurator.GetModelConfiguration(componentType.ReturnedClass);
                AddDataProperties(
                    componentType.PropertyNames,
                    componentType.Subtypes,
                    componentType.PropertyNullability,
                    null,
                    null,
                    true,
                    entityType,
                    modelConfiguration,
                    metadata,
                    persister.Factory);
                AddAssociationProperties(
                    componentType.PropertyNames,
                    componentType.Subtypes,
                    true,
                    i => componentType.GetCascadeStyle(i),
                    entityType,
                    null,
                    modelConfiguration,
                    entityMetadata);
            }
        }
        private BreezeMetadata GetMetadataFromContext(DbContext dbContext)
        {
            var metadata = new BreezeMetadata();

            metadata.StructuralTypes = dbContext.Model.GetEntityTypes().Select(et => {
                var mt = new MetaType();
                metadata.StructuralTypes.Add(mt);
                mt.ShortName = et.Name;
                mt.Namespace = et.ClrType.Namespace;

                mt.DataProperties = et.GetProperties().Select(p => {
                    var dp = new MetaDataProperty();

                    dp.NameOnServer    = p.Name;
                    dp.IsNullable      = p.IsNullable;
                    dp.IsPartOfKey     = p.IsPrimaryKey();
                    dp.MaxLength       = p.GetMaxLength();
                    dp.DataType        = p.ClrType.ToString();
                    dp.ConcurrencyMode = p.IsConcurrencyToken ? "None" : "Identity";
                    var dfa            = p.GetAnnotations().Where(a => a.Name == "DefaultValue").FirstOrDefault();
                    if (dfa != null)
                    {
                        dp.DefaultValue = dfa.Value;
                    }
                    return(dp);
                }).ToList();
                mt.NavigationProperties = et.GetNavigations().Select(p => {
                    var np            = new MetaNavProperty();
                    np.NameOnServer   = p.Name;
                    np.EntityTypeName = p.GetTargetType().Name;
                    np.IsScalar       = !p.IsCollection();
                    // FK_<dependent type name>_<principal type name>_<foreign key property name>
                    np.AssociationName = BuildAssocName(p);
                    if (p.IsDependentToPrincipal())
                    {
                        np.AssociationName         = BuildAssocName(p);
                        np.ForeignKeyNamesOnServer = p.ForeignKey.Properties.Select(fkp => fkp.Name).ToList();
                    }
                    else
                    {
                        np.AssociationName            = BuildAssocName(p.FindInverse());
                        np.InvForeignKeyNamesOnServer = p.ForeignKey.Properties.Select(fkp => fkp.Name).ToList();
                    }

                    return(np);
                }).ToList();
                return(mt);
            }).ToList();
            return(metadata);
        }
Exemplo n.º 10
0
        private BreezeMetadata GetMetadataFromContext(DbContext dbContext)
        {
            var metadata = new BreezeMetadata();
            var dbSetMap = GetDbSetMap(dbContext);

            metadata.StructuralTypes = dbContext.Model.GetEntityTypes()
                                       .Where(et => !et.IsOwned())
                                       .Select(et => CreateMetaType(et, dbSetMap)).ToList();


            // get the enums out of the model types
            // for nullable enum we must call Nullable.GetUnderlyingType
            var enums = dbContext.Model.GetEntityTypes().Where(et => et.GetProperties().Any(p =>
                                                                                            p.PropertyInfo != null && (p.PropertyInfo.PropertyType.IsEnum || (Nullable.GetUnderlyingType(p.PropertyInfo.PropertyType) != null && Nullable.GetUnderlyingType(p.PropertyInfo.PropertyType).IsEnum))))
                        .Select(et => et.GetProperties().Where(p => p.PropertyInfo.PropertyType.IsEnum || (Nullable.GetUnderlyingType(p.PropertyInfo.PropertyType) != null && Nullable.GetUnderlyingType(p.PropertyInfo.PropertyType).IsEnum))).ToList();

            foreach (var myEnum in enums)
            {
                var realType = myEnum.First().ClrType;
                //check if realType is nullable
                if (Nullable.GetUnderlyingType(realType) != null)
                {
                    realType = Nullable.GetUnderlyingType(realType);
                }
                string[] enumNames = Enum.GetNames(realType);
                var      p         = new Dictionary <string, object>();
                p.Add("shortName", realType.Name);
                p.Add("namespace", realType.Namespace);
                p.Add("values", enumNames);
                if (!metadata.EnumTypes.Exists(x => x.ContainsValue(realType.Name)))
                {
                    metadata.EnumTypes.Add(p);
                }
            }

            var complexTypes = dbContext.Model.GetEntityTypes()
                               .Where(et => et.IsOwned())
                               .Select(et => CreateMetaType(et, dbSetMap)).ToList();
            // Complex types show up once per parent reference and we need to reduce
            // this to just the unique types.
            var complexTypesMap = complexTypes.ToDictionary(mt => mt.ShortName);

            complexTypesMap.Values.ToList().ForEach(v => metadata.StructuralTypes.Insert(0, v));

            return(metadata);
        }
        private void AddClientModelType(ClientModelMetadata modelMetadata, BreezeMetadata metadata)
        {
            var modelConfiguration = _breezeConfigurator.GetModelConfiguration(modelMetadata.Type);
            var entityType         = GetOrCreateEntityType(
                modelMetadata.Type,
                modelConfiguration,
                metadata);

            entityType.IsUnmapped = true;

            foreach (var property in modelMetadata.Properties)
            {
                var memberConfiguration = modelConfiguration.GetMember(property.Name);
                if (memberConfiguration?.Ignored == true)
                {
                    continue;
                }

                if (property.IsAssociationType)
                {
                    entityType.NavigationProperties.Add(CreateNavigationProperty(property, modelMetadata));
                    continue;
                }

                if (property.IsComplexType)
                {
                    AddComplexType(property.Type, metadata);
                }

                var dataProperty = CreateDataProperty(property, memberConfiguration, entityType);
                if (property.IsPartOfKey)
                {
                    entityType.DataProperties.Insert(0, dataProperty);
                }
                else
                {
                    entityType.DataProperties.Add(dataProperty);
                }
            }

            AddSyntheticMembers(entityType, modelConfiguration);
            AddSyntheticForeignKeyProperties(modelMetadata, entityType, modelConfiguration);
        }
        /// <summary>
        /// Builds <see cref="BreezeMetadata"/>.
        /// </summary>
        /// <returns>The breeze metadata.</returns>
        public BreezeMetadata Build()
        {
            var metadata = new BreezeMetadata
            {
                StructuralTypes             = new List <StructuralType>(),
                ResourceEntityTypeMap       = new Dictionary <string, string>(),
                EnumTypes                   = new List <EnumType>(),
                LocalQueryComparisonOptions = _localQueryComparisonOptions ?? "caseInsensitiveSQL"
            };

            _addedTypes.Clear();
            _entityMetadata = _classMetadataProvider.GetAll()
                              .Select(o => o.MappedClass)
                              .Where(o => o != null)
                              .Where(o => _includePredicate?.Invoke(o) ?? true)
                              .Distinct()
                              .Select(o => new { MappedClass = o, Metadata = _entityMetadataProvider.GetMetadata(o) })
                              .ToDictionary(o => o.MappedClass, o => o.Metadata);

            foreach (var entityMetadata in _entityMetadata.Values)
            {
                AddEntityType(entityMetadata, metadata);
            }

            if (_clientModelAssemblies == null)
            {
                return(metadata);
            }

            // Add client models
            _clientModelMetadata = _clientModelAssemblies?.SelectMany(assembly => assembly.GetTypes()
                                                                      .Where(t => t.IsClass && !t.IsAbstract && _clientModelMetadataProvider.IsClientModel(t)))
                                   .Where(t => _includePredicate?.Invoke(t) ?? true)
                                   .Select(o => _clientModelMetadataProvider.GetMetadata(o))
                                   .ToDictionary(o => o.Type, o => o);

            foreach (var modelMetadata in _clientModelMetadata.Values)
            {
                AddClientModelType(modelMetadata, metadata);
            }

            return(metadata);
        }
Exemplo n.º 13
0
        private BreezeMetadata GetMetadataFromContext(DbContext dbContext)
        {
            var metadata = new BreezeMetadata();
            var dbSetMap = GetDbSetMap(dbContext);

            metadata.StructuralTypes = dbContext.Model.GetEntityTypes()
                                       .Where(et => !et.IsOwned())
                                       .Select(et => CreateMetaType(et, dbSetMap)).ToList();


            var complexTypes = dbContext.Model.GetEntityTypes()
                               .Where(et => et.IsOwned())
                               .Select(et => CreateMetaType(et, dbSetMap)).ToList();
            // Complex types show up once per parent reference and we need to reduce
            // this to just the unique types.
            var complexTypesMap = complexTypes.ToDictionary(mt => mt.ShortName);

            complexTypesMap.Values.ToList().ForEach(v => metadata.StructuralTypes.Add(v));

            return(metadata);
        }
        private void AddEntityType(
            EntityMetadata entityMetadata,
            BreezeMetadata metadata)
        {
            var type = entityMetadata.Type;
            var modelConfiguration = _breezeConfigurator.GetModelConfiguration(type);
            var entityType         = new EntityType(type)
            {
                BaseTypeName = entityMetadata.BaseType != null
                    ? GetBreezeTypeFullName(entityMetadata.BaseType)
                    : null,
                AutoGeneratedKeyType = modelConfiguration.AutoGeneratedKeyType ?? entityMetadata.AutoGeneratedKeyType,
                DefaultResourceName  = modelConfiguration.ResourceName ?? Pluralize(type.Name),
                Custom = modelConfiguration.Custom
            };

            metadata.ResourceEntityTypeMap.Add(entityType.DefaultResourceName, GetBreezeTypeFullName(type));

            AddProperties(entityMetadata, entityType, modelConfiguration, metadata);

            metadata.StructuralTypes.Add(entityType);
        }
        private void AddDataProperties(
            string[] propertyNames,
            IType[] propertyTypes,
            bool[] propertyNullability,
            IReadOnlyCollection <string> superProperties,
            int?versionPropertyIndex,
            bool partsOfKey,
            StructuralType structuralType,
            ModelConfiguration modelConfiguration,
            BreezeMetadata metadata,
            ISessionFactoryImplementor sessionFactory)
        {
            for (var i = 0; i < propertyNames.Length; i++)
            {
                var propertyType        = propertyTypes[i];
                var propertyName        = propertyNames[i];
                var memberConfiguration = modelConfiguration.GetMember(propertyNames[i]);
                if (
                    memberConfiguration?.Ignored == true ||
                    superProperties?.Contains(propertyName) == true ||
                    propertyType.IsAssociationType)
                {
                    continue;
                }

                var dataProperty = CreateDataProperty(
                    propertyName,
                    propertyType,
                    partsOfKey,
                    propertyNullability[i],
                    i == versionPropertyIndex,
                    memberConfiguration,
                    structuralType,
                    sessionFactory);
                if (propertyType is IAbstractComponentType componentType)
                {
                    AddComplexType(
                        componentType,
                        _breezeConfigurator.GetModelConfiguration(propertyType.ReturnedClass),
                        metadata,
                        partsOfKey,
                        sessionFactory);
                }

                if (partsOfKey)
                {
                    structuralType.DataProperties.Insert(0, dataProperty);
                }
                else
                {
                    structuralType.DataProperties.Add(dataProperty);
                }

                // Map enum type
                if (propertyType is AbstractEnumType nhEnumType && _addedTypes.Add(nhEnumType.ReturnedClass))
                {
                    var enumType = nhEnumType.ReturnedClass;
                    metadata.EnumTypes.Add(new EnumType
                    {
                        Namespace = enumType.Namespace,
                        ShortName = enumType.Name,
                        Values    = Enum.GetNames(enumType)
                    });
                }
            }
        }
Exemplo n.º 16
0
 /// <summary>
 /// Constructs an instance of <see cref="BreezeEntityValidator"/>.
 /// </summary>
 public BreezeEntityValidator(BreezeMetadata breezeMetadata)
 {
     _structuralTypes = breezeMetadata.StructuralTypes.ToDictionary(o => o.Type);
 }