示例#1
0
 public EntityBuilder(EntityMap <T> entityMap)
 {
     this._entityMap = entityMap;
 }
示例#2
0
文件: Model.cs 项目: jaygumji/Enigma
        private void RegisterHierarchy(Type entityType, string name)
        {
            if (_entityMaps.ContainsKey(name))
            {
                return;
            }

            var properties       = entityType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
            var propertyMappings = new Dictionary <string, IPropertyMap>();
            var propertyMapType  = typeof(PropertyMap <>);

            var relationTypes = new List <Type>();

            foreach (var property in properties.Where(p => p.CanRead && p.CanWrite).OrderBy(p => p.Name))
            {
                if (!propertyMappings.ContainsKey(property.Name))
                {
                    var genericPropertyMapType = propertyMapType.MakeGenericType(property.PropertyType);
                    var propertyIndex          = propertyMappings.Count + 1;
                    var propertyMap            = (IPropertyMap)Activator.CreateInstance(genericPropertyMapType, property, propertyIndex);
                    propertyMappings.Add(property.Name, propertyMap);

                    var extended = new ExtendedType(property.PropertyType);
                    if (extended.Classification == TypeClassification.Collection)
                    {
                        var collectionInfo      = extended.Container.AsCollection();
                        var extendedElementType = new ExtendedType(collectionInfo.ElementType);
                        if (extendedElementType.Classification == TypeClassification.Complex)
                        {
                            relationTypes.Add(collectionInfo.ElementType);
                        }
                    }
                    else if (extended.Classification == TypeClassification.Dictionary)
                    {
                        var dictionaryInfo  = extended.Container.AsDictionary();
                        var extendedKeyType = new ExtendedType(dictionaryInfo.KeyType);
                        if (extendedKeyType.Classification == TypeClassification.Complex)
                        {
                            relationTypes.Add(dictionaryInfo.KeyType);
                        }

                        var extendedValueType = new ExtendedType(dictionaryInfo.ValueType);
                        if (extendedValueType.Classification == TypeClassification.Complex)
                        {
                            relationTypes.Add(dictionaryInfo.ValueType);
                        }
                    }
                    else if (extended.Classification == TypeClassification.Complex)
                    {
                        relationTypes.Add(property.PropertyType);
                    }
                }
            }

            var entityMap = EntityMap.Create(entityType, propertyMappings.Values, new IIndex[] {});

            if (propertyMappings.ContainsKey("Id"))
            {
                entityMap.KeyName = "Id";
            }
            else if (propertyMappings.ContainsKey("ID"))
            {
                entityMap.KeyName = "ID";
            }
            else if (propertyMappings.ContainsKey(entityType.Name + "Id"))
            {
                entityMap.KeyName = entityType.Name + "Id";
            }
            else if (propertyMappings.ContainsKey(entityType.Name + "ID"))
            {
                entityMap.KeyName = entityType.Name + "ID";
            }
            else if (propertyMappings.ContainsKey("Guid"))
            {
                entityMap.KeyName = "Guid";
            }
            else if (propertyMappings.ContainsKey("GUID"))
            {
                entityMap.KeyName = "GUID";
            }

            _entityMaps.Add(name, entityMap);

            foreach (var relationType in relationTypes)
            {
                RegisterHierarchy(relationType);
            }
        }
示例#3
0
 public PropertyBuilder(EntityMap entityMap, PropertyMap <T> propertyMap)
 {
     _entityMap   = entityMap;
     _propertyMap = propertyMap;
 }