//-----------------------------------------------------------------------------------------------------------------------------------------------------
        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);
 }
예제 #11
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------
        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;
 }