//----------------------------------------------------------------------------------------------------------------------------------------------------- protected virtual void ApplyToType(TypeMetadataBuilder type) { type.RelationalMapping = new TypeRelationalMappingBuilder() { PrimaryTableName = NameTypePrimaryTable(type), InheritanceKind = GetInheritanceKind(type) }; var keyProperties = new HashSet<PropertyMetadataBuilder>(); foreach ( var key in type.AllKeys ) { foreach ( var property in key.Properties ) { keyProperties.Add(property); property.RelationalMapping = new PropertyRelationalMappingBuilder() { TableName = NameKeyPropertyColumnTable(type, key, property), ColumnName = NameKeyPropertyColumn(type, key, property), DataTypeName = NameKeyPropertyColumnDataType(type, key, property) }; } } foreach ( var property in type.Properties.Where(p => !keyProperties.Contains(p)) ) { property.RelationalMapping = new PropertyRelationalMappingBuilder() { TableName = NamePropertyColumnTable(type, property), ColumnName = NamePropertyColumn(type, property), DataTypeName = NamePropertyColumnDataType(type, property) }; } }
/// <summary> /// Initialize this serializer with <see cref="ITypeMetadata{PT}"/> pertaining to the /// specified class. /// </summary> /// <param name="typeId"> /// POF type id that uniquely identifies this type. /// </param> /// <param name="type"> /// Type this serializer is aware of. /// </param> /// <param name="autoIndex"> /// Turns on the auto index feature. /// </param> /// <exception cref="ArgumentException"> /// If annotation is not present on <c>type</c>. /// </exception> private void Initialize(int typeId, Type type, bool autoIndex) { Portable portable = Attribute.GetCustomAttribute(type, typeof(Portable)) as Portable; if (portable == null) { throw new ArgumentException(string.Format( "Attempting to use {0} for a class ({1}) that has no {2} annotation", GetType().Name, type.Name, typeof(Portable).Name)); } // via the builder create the type metadata TypeMetadataBuilder <object> builder = new TypeMetadataBuilder <object>() .SetTypeId(typeId); builder.Accept(new AnnotationVisitor <TypeMetadataBuilder <object>, object>(autoIndex), type); m_tmd = builder.Build(); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected virtual RelationalInheritanceKind? GetInheritanceKind(TypeMetadataBuilder type) { return RelationalInheritanceKind.TablePerHierarchy; }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected abstract string NameTypePrimaryTable(TypeMetadataBuilder type);
protected abstract string NamePropertyColumnTable(TypeMetadataBuilder type, PropertyMetadataBuilder property);
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected virtual string NameKeyPropertyColumnTable(TypeMetadataBuilder type, KeyMetadataBuilder key, PropertyMetadataBuilder property) { return NamePropertyColumnTable(type, property); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override string NameTypePrimaryTable(TypeMetadataBuilder type) { return ToUnderscoreConvention(_usePluralTableNames ? base.PluralizationService.Pluralize(type.Name) : type.Name); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override string NamePropertyColumnTable(TypeMetadataBuilder type, PropertyMetadataBuilder property) { return type.RelationalMapping.PrimaryTableName; }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override string NamePropertyColumnDataType(TypeMetadataBuilder type, PropertyMetadataBuilder property) { return null; }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override string NamePropertyColumn(TypeMetadataBuilder type, PropertyMetadataBuilder property) { return ToUnderscoreConvention(property.Name); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- private TypeMetadataBuilder BuildTypeMetadata(Type primaryContract, Type[] mixinContracts) { var entriesBeingBuilt = _s_entriesBeingBuilt; var ownEntriesBeingBuilt = (entriesBeingBuilt == null); if ( ownEntriesBeingBuilt ) { entriesBeingBuilt = new Dictionary<Type, TypeMetadataBuilder>(); _s_entriesBeingBuilt = entriesBeingBuilt; } try { var builder = new TypeMetadataBuilder(); entriesBeingBuilt.Add(primaryContract, builder); var constructor = new TypeMetadataBuilderConstructor(new DataObjectConventions()); constructor.ConstructMetadata(primaryContract, mixinContracts, builder, cache: this); return builder; } finally { if ( ownEntriesBeingBuilt ) { _s_entriesBeingBuilt = null; } else { entriesBeingBuilt.Remove(primaryContract); } } }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override string NamePropertyColumn(TypeMetadataBuilder type, PropertyMetadataBuilder property) { return property.Name; }