Exemple #1
0
        private void AddJoinedSubclasses(HbmJoinedSubclass joinedSubclass,
                                         IDictionary <string, MetaAttribute> inheritedMetas)
        {
            var binder = new JoinedSubclassBinder(Mappings, dialect);

            binder.Bind(joinedSubclass, inheritedMetas);
        }
Exemple #2
0
        private static string GetFileName(HbmMapping hbmMapping)
        {
            string   name = "MyMapping";
            HbmClass rc   = hbmMapping.RootClasses.FirstOrDefault();

            if (rc != null)
            {
                name = rc.Name;
            }
            HbmSubclass sc = hbmMapping.SubClasses.FirstOrDefault();

            if (sc != null)
            {
                name = sc.Name;
            }
            HbmJoinedSubclass jc = hbmMapping.JoinedSubclasses.FirstOrDefault();

            if (jc != null)
            {
                name = jc.Name;
            }
            HbmUnionSubclass uc = hbmMapping.UnionSubclasses.FirstOrDefault();

            if (uc != null)
            {
                name = uc.Name;
            }
            return(name + ".hbm.xml");
        }
        private void VerifyHinheritedMapping(HbmMapping mapping)
        {
            mapping.JoinedSubclasses.Should().Have.Count.EqualTo(1);
            HbmJoinedSubclass jsc = mapping.JoinedSubclasses.Single();

            jsc.extends.Should().Not.Be.Null().And.Contain("EntitySimple");
            jsc.key.Should().Not.Be.Null();
            jsc.key.Columns.Should().Not.Be.Empty();
            jsc.key.Columns.Single().name.Should().Not.Be.Null().And.Not.Be.Empty();
            jsc.Properties.Should().Have.Count.EqualTo(1);
            jsc.Properties.Single().Name.Should().Be.EqualTo("Surname");
        }
Exemple #4
0
        public void HandleJoinedSubclass(PersistentClass model, HbmJoinedSubclass joinedSubclassMapping, IDictionary <string, MetaAttribute> inheritedMetas)
        {
            var subclass = new JoinedSubclass(model);

            BindClass(joinedSubclassMapping, subclass, inheritedMetas);
            inheritedMetas = GetMetas(joinedSubclassMapping, inheritedMetas, true);             // get meta's from <joined-subclass>

            // joined subclass
            if (subclass.EntityPersisterClass == null)
            {
                subclass.RootClazz.EntityPersisterClass = typeof(JoinedSubclassEntityPersister);
            }

            //table + schema names
            string schema  = joinedSubclassMapping.schema ?? mappings.SchemaName;
            string catalog = joinedSubclassMapping.catalog ?? mappings.CatalogName;

            // TODO: very strange, the schema does not support it
            //XmlAttribute actionNode = subnode.Attributes["schema-action"];
            //string action = actionNode == null ? "all" : actionNode.Value;
            string action = "all";

            Table mytable = mappings.AddTable(schema, catalog, GetClassTableName(subclass, joinedSubclassMapping.table), null, false, action);

            ((ITableOwner)subclass).Table = mytable;

            log.InfoFormat("Mapping joined-subclass: {0} -> {1}", subclass.EntityName, subclass.Table.Name);

            // KEY
            BindKey(subclass, joinedSubclassMapping.key, mytable);

            subclass.CreatePrimaryKey(dialect);

            if (!subclass.IsJoinedSubclass)
            {
                throw new MappingException(
                          "Cannot map joined-subclass " + subclass.EntityName + " to table " +
                          subclass.Table.Name + ", the same table as its base class.");
            }

            subclass.CreateForeignKey();
            // CHECK
            mytable.AddCheckConstraint(joinedSubclassMapping.check);

            // properties
            new PropertiesBinder(mappings, subclass, dialect).Bind(joinedSubclassMapping.Properties, inheritedMetas);

            BindJoinedSubclasses(joinedSubclassMapping.JoinedSubclasses, subclass, inheritedMetas);

            model.AddSubclass(subclass);
            mappings.AddClass(subclass);
        }
        private void MapExtensionsToCoreEntity(Dictionary <string, HbmClass> classMappingByEntityName,
                                               Dictionary <string, HbmJoinedSubclass> joinedSubclassMappingByEntityName,
                                               Dictionary <string, HbmJoin> subclassJoinMappingByEntityName)
        {
            // foreach entity name, look in core mapping file (e.mapping) for core entity mapping and if found
            // concat new extension HbmDynamicComponent to current set of items.
            foreach (string entityName in _entityExtensionHbmBagsByEntityName.Keys)
            {
                HbmClass          classMapping;
                HbmJoinedSubclass joinedSubclassMapping = null;
                HbmJoin           subclassJoinMapping   = null;

                if (!classMappingByEntityName.TryGetValue(entityName, out classMapping) &&
                    !joinedSubclassMappingByEntityName.TryGetValue(entityName, out joinedSubclassMapping) &&
                    !subclassJoinMappingByEntityName.TryGetValue(entityName, out subclassJoinMapping))
                {
                    throw new MappingException(
                              $"The entity extension to entity '{entityName}' could not be applied because the class mapping could not be found.");
                }

                var extensionComponent = new HbmDynamicComponent
                {
                    name  = EntityExtensionMemberName,
                    Items = _entityExtensionHbmBagsByEntityName[entityName]
                            .Select(x => (object)x)
                            .ToArray()
                };

                if (classMapping != null)
                {
                    classMapping.Items = classMapping.Items.Concat(extensionComponent)
                                         .ToArray();
                }
                else if (joinedSubclassMapping != null)
                {
                    joinedSubclassMapping.Items = joinedSubclassMapping.Items.Concat(extensionComponent)
                                                  .ToArray();
                }
                else
                {
                    subclassJoinMapping.Items = subclassJoinMapping.Items.Concat(extensionComponent)
                                                .ToArray();
                }
            }
        }
Exemple #6
0
        public void Bind(HbmJoinedSubclass joinedSubclassMapping, IDictionary <string, MetaAttribute> inheritedMetas)
        {
            PersistentClass superModel = GetSuperclass(joinedSubclassMapping.extends);

            HandleJoinedSubclass(superModel, joinedSubclassMapping, inheritedMetas);
        }
Exemple #7
0
        private void Configuration_BeforeBindMapping(object sender, BindMappingEventArgs e)
        {
            // When core mapping file loaded, attach any extensions to their core entity counterpart
            if (IsEdFiStandardMappingEvent())
            {
                var classMappingByEntityName = e.Mapping.Items.OfType <HbmClass>()
                                               .ToDictionary(
                    x => x.Name.Split('.')
                    .Last(),
                    x => x);

                var joinedSubclassMappingByEntityName = e.Mapping.Items.OfType <HbmClass>()
                                                        .SelectMany(i => i.JoinedSubclasses)
                                                        .ToDictionary(
                    x => x.Name.Split('.')
                    .Last(),
                    x => x);

                var subclassJoinMappingByEntityName = e.Mapping.Items.OfType <HbmClass>()
                                                      .SelectMany(i => i.Subclasses)
                                                      .Where(sc => sc.Joins.Count() == 1)
                                                      .ToDictionary(
                    x => x.Name.Split('.')
                    .Last(),
                    x => x.Joins.Single());

                MapExtensionsToCoreEntity(
                    classMappingByEntityName, joinedSubclassMappingByEntityName, subclassJoinMappingByEntityName);

                MapJoinedSubclassesToCoreEntity(
                    classMappingByEntityName, joinedSubclassMappingByEntityName, subclassJoinMappingByEntityName);

                MapDescriptorToCoreDescriptorEntity(classMappingByEntityName);

                MapDerivedEntityToCoreEntity(classMappingByEntityName);
            }

            foreach (var beforeBindMappingActivity in _beforeBindMappingActivities)
            {
                beforeBindMappingActivity.Execute(sender, e);
            }

            void MapDerivedEntityToCoreEntity(Dictionary <string, HbmClass> classMappingByEntityName)
            {
                foreach (string entityName in _extensionDerivedEntityByEntityName.Keys)
                {
                    if (!classMappingByEntityName.TryGetValue(entityName, out HbmClass classMapping))
                    {
                        throw new MappingException(
                                  $"The subclass extension to entity '{entityName}' could not be applied because the class mapping could not be found.");
                    }

                    var hbmSubclasses = _extensionDerivedEntityByEntityName[entityName].Select(x => (object)x).ToArray();

                    classMapping.Items1 = (classMapping.Items1 ?? new object[0]).Concat(hbmSubclasses).ToArray();
                }
            }

            void MapDescriptorToCoreDescriptorEntity(Dictionary <string, HbmClass> classMappingByEntityName)
            {
                // foreach entity name, look in core mapping file (e.mapping) for core entity mapping and if found
                // concat new extension HbmJoinedSubclass to current set of Ed-Fi entity HbmJoinedSubclasses.
                foreach (string entityName in _extensionDescriptorByEntityName.Keys)
                {
                    if (!classMappingByEntityName.TryGetValue(entityName, out HbmClass classMapping))
                    {
                        throw new MappingException(
                                  $"The subclass extension to entity '{entityName}' could not be applied because the class mapping could not be found.");
                    }

                    var hbmJoinedSubclasses = _extensionDescriptorByEntityName[entityName]
                                              .Select(x => (object)x)
                                              .ToArray();

                    classMapping.Items1 = (classMapping.Items1 ?? new object[0]).Concat(hbmJoinedSubclasses)
                                          .ToArray();
                }
            }

            void MapJoinedSubclassesToCoreEntity(Dictionary <string, HbmClass> classMappingByEntityName,
                                                 Dictionary <string, HbmJoinedSubclass> joinedSubclassMappingByEntityName,
                                                 Dictionary <string, HbmJoin> subclassJoinMappingByEntityName)
            {
                // foreach entity name, look in core mapping file (e.mapping) for core entity mapping and if found
                // concat new extension HbmDynamicComponent to current set of items.
                foreach (string entityName in _aggregateExtensionHbmBagsByEntityName.Keys)
                {
                    HbmJoinedSubclass joinedSubclassMapping = null;
                    HbmJoin           subclassJoinMapping   = null;

                    if (!classMappingByEntityName.TryGetValue(entityName, out HbmClass classMapping) &&
                        !joinedSubclassMappingByEntityName.TryGetValue(entityName, out joinedSubclassMapping) &&
                        !subclassJoinMappingByEntityName.TryGetValue(entityName, out subclassJoinMapping))
                    {
                        throw new MappingException(
                                  $"The aggregate extensions to entity '{entityName}' could not be applied because the class mapping could not be found.");
                    }

                    var extensionComponent = new HbmDynamicComponent
                    {
                        name  = AggregateExtensionMemberName,
                        Items = _aggregateExtensionHbmBagsByEntityName[entityName]
                                .Select(x => (object)x)
                                .ToArray()
                    };

                    if (classMapping != null)
                    {
                        classMapping.Items = classMapping.Items.Concat(extensionComponent)
                                             .ToArray();
                    }
                    else if (joinedSubclassMapping != null)
                    {
                        joinedSubclassMapping.Items = joinedSubclassMapping.Items.Concat(extensionComponent)
                                                      .ToArray();
                    }
                    else if (subclassJoinMapping != null)
                    {
                        subclassJoinMapping.Items = subclassJoinMapping.Items.Concat(extensionComponent)
                                                    .ToArray();
                    }
                }
            }

            void MapExtensionsToCoreEntity(Dictionary <string, HbmClass> classMappingByEntityName,
                                           Dictionary <string, HbmJoinedSubclass> joinedSubclassMappingByEntityName,
                                           Dictionary <string, HbmJoin> subclassJoinMappingByEntityName)
            {
                // foreach entity name, look in core mapping file (e.mapping) for core entity mapping and if found
                // concat new extension HbmDynamicComponent to current set of items.
                foreach (string entityName in _entityExtensionHbmBagsByEntityName.Keys)
                {
                    HbmJoinedSubclass joinedSubclassMapping = null;
                    HbmJoin           subclassJoinMapping   = null;

                    if (!classMappingByEntityName.TryGetValue(entityName, out HbmClass classMapping) &&
                        !joinedSubclassMappingByEntityName.TryGetValue(entityName, out joinedSubclassMapping) &&
                        !subclassJoinMappingByEntityName.TryGetValue(entityName, out subclassJoinMapping))
                    {
                        throw new MappingException(
                                  $"The entity extension to entity '{entityName}' could not be applied because the class mapping could not be found.");
                    }

                    var extensionComponent = new HbmDynamicComponent
                    {
                        name  = EntityExtensionMemberName,
                        Items = _entityExtensionHbmBagsByEntityName[entityName]
                                .Select(x => (object)x)
                                .ToArray()
                    };

                    if (classMapping != null)
                    {
                        classMapping.Items = classMapping.Items.Concat(extensionComponent)
                                             .ToArray();
                    }
                    else if (joinedSubclassMapping != null)
                    {
                        joinedSubclassMapping.Items = joinedSubclassMapping.Items.Concat(extensionComponent)
                                                      .ToArray();
                    }
                    else if (subclassJoinMapping != null)
                    {
                        subclassJoinMapping.Items = subclassJoinMapping.Items.Concat(extensionComponent)
                                                    .ToArray();
                    }
                }
            }

            bool IsEdFiStandardMappingEvent()
            {
                return([email protected](Namespaces.Entities.NHibernate.BaseNamespace) &&
                       e.Mapping.assembly.Equals(Namespaces.Standard.BaseNamespace));
            }
        }