private void AddJoinedSubclasses(HbmJoinedSubclass joinedSubclass, IDictionary <string, MetaAttribute> inheritedMetas) { var binder = new JoinedSubclassBinder(Mappings, dialect); binder.Bind(joinedSubclass, inheritedMetas); }
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"); }
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(); } } }
public void Bind(HbmJoinedSubclass joinedSubclassMapping, IDictionary <string, MetaAttribute> inheritedMetas) { PersistentClass superModel = GetSuperclass(joinedSubclassMapping.extends); HandleJoinedSubclass(superModel, joinedSubclassMapping, inheritedMetas); }
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)); } }