Esempio n. 1
0
        private static DbEntityBase Parse(string table, IDataReader reader, Dictionary <string, bool> columns, string prefix = null)
        {
            if (!EntityTablesInfos.ContainsKey(table))
            {
                throw new EntityException("table {0} is not registered", table);
            }

            EntityInfo tableInfo = EntityTablesInfos[table];
            var        entity    = tableInfo.Factory();

            foreach (var field in tableInfo.PrimaryKeysByFieldName)
            {
                var key = prefix != null ? prefix + "_" + field.Key : field.Key;

                if (columns.ContainsKey(key) && reader[key] != DBNull.Value && tableInfo.Setters.ContainsKey(field.Value.PropertyName))
                {
                    tableInfo.Setters[field.Value.PropertyName](entity, reader[key]);
                }
            }

            foreach (var field in tableInfo.FieldsByFieldName)
            {
                var key = prefix != null ? prefix + "_" + field.Key : field.Key;

                if (columns.ContainsKey(key) && reader[key] != DBNull.Value && tableInfo.Setters.ContainsKey(field.Value.PropertyName))
                {
                    tableInfo.Setters[field.Value.PropertyName](entity, reader[key]);
                }
            }

            foreach (var relation in tableInfo.RelationsToOneByFieldName)
            {
                if (columns.ContainsKey(relation.Key) && reader[relation.Key] != DBNull.Value && tableInfo.Setters.ContainsKey(relation.Value.PropertyName))
                {
                    var entityRelation = tableInfo.RelationsToOneByFieldName[relation.Key];
                    tableInfo.Setters[relation.Value.PropertyName](entity, Parse(entityRelation.RelatedTable, reader, columns, entityRelation.Prefix));
                }
            }

            return(entity);
        }
Esempio n. 2
0
        internal static void Register()
        {
            if (!_isRegistered && !_isRegistering)
            {
                _isRegistering = true;

                EntityInfo = new EntityInfo
                {
                    Factory     = CreateFactory <TEntity>(),
                    ListFactory = CreateFactory <List <TEntity> >()
                };

                var entityType     = typeof(TEntity);
                var entityTypeInfo = entityType.GetTypeInfo();

                var  attributes = entityTypeInfo.GetCustomAttributes(false);
                bool tableSet   = false;
                foreach (Attribute attr in attributes)
                {
                    if (attr is DbTable)
                    {
                        DbTable dbTable = attr as DbTable;
                        EntityInfo.Table = dbTable.Name;

                        tableSet = true;
                    }
                }

                if (!tableSet)
                {
                    throw new EntityException("Error while registering entity {0} : no DbTable attribute found to match table", entityType.Name);
                }

                PropertyInfo[] properties = entityType.GetProperties();

                int nbKeys = 0;
                foreach (PropertyInfo property in properties)
                {
                    attributes = property.GetCustomAttributes(false);

                    foreach (var attribute in attributes)
                    {
                        if (attribute is DbKey)
                        {
                            var dbKey = attribute as DbKey;

                            if (EntityInfo.PrimaryKeysByFieldName.ContainsKey(dbKey.Name))
                            {
                                throw new EntityException("Error while registering entity {0} : duplicate primary key detected ({1})", entityType.Name, dbKey.Name);
                            }

                            var key = new EntityKey()
                            {
                                IsAutoIncremented = dbKey.IsAutoIncremented, Sequence = dbKey.Sequence, Name = dbKey.Name, PropertyName = property.Name, Type = property.PropertyType
                            };

                            EntityInfo.AddEntityKey(key);

                            EntityInfo.Setters.Add(property.Name, CreateSetter(property.Name, property.PropertyType));
                            EntityInfo.Getters.Add(property.Name, CreateGetter(property.Name));
                            nbKeys++;

                            if (dbKey.IsAutoIncremented)
                            {
                                if (EntityInfo.HasSeededKey)
                                {
                                    throw new EntityException("Error while registering entity {0} : only one seeded column is authorized", entityType.Name);
                                }

                                EntityInfo.SeededKey = key;
                            }
                        }
                        else if (attribute is DbChildRelation)
                        {
                            var dbRelation = attribute as DbChildRelation;
                            var relation   = new EntityRelation()
                            {
                                RelatedTable = dbRelation.ChildTable, TableKey = dbRelation.TableKey, RelatedTableKey = dbRelation.ChildTableKey, Prefix = dbRelation.Prefix, Type = property.PropertyType, PropertyName = property.Name
                            };

                            RegisterChildIfNeeded(property.PropertyType);

                            if (property.PropertyType.IsGenericParameter)
                            {
                                EntityInfo.AddEntityRelationsToMany(relation);
                            }
                            else
                            {
                                EntityInfo.AddEntityRelationsToOne(relation);

                                EntityInfo.Setters.Add(property.Name, CreateSetter(property.Name, property.PropertyType));
                                EntityInfo.Getters.Add(property.Name, CreateGetter(property.Name));
                            }
                        }
                        else if (attribute is DbParentRelation)
                        {
                            var dbRelation = attribute as DbParentRelation;
                            var relation   = new EntityRelation()
                            {
                                Name = dbRelation.TableKey, RelatedTable = dbRelation.ParentTable, TableKey = dbRelation.TableKey, RelatedTableKey = dbRelation.ParentTableKey, Prefix = dbRelation.Prefix, Type = property.PropertyType, PropertyName = property.Name
                            };

                            RegisterChildIfNeeded(property.PropertyType);

                            if (property.PropertyType.IsGenericParameter)
                            {
                                EntityInfo.AddEntityRelationsToMany(relation);
                            }
                            else
                            {
                                EntityInfo.AddEntityRelationsToOne(relation);

                                EntityInfo.Setters.Add(property.Name, CreateSetter(property.Name, property.PropertyType));
                                EntityInfo.Getters.Add(property.Name, CreateGetter(property.Name));
                            }
                        }
                        else if (attribute is DbField)
                        {
                            var dbField = attribute as DbField;

                            if (EntityInfo.FieldsByFieldName.ContainsKey(dbField.Name))
                            {
                                throw new EntityException("Error while registering entity {0} : duplicate field name detected ({1})", entityType.Name, dbField.Name);
                            }

                            var field = new EntityField()
                            {
                                Name = dbField.Name, Type = property.PropertyType, PropertyName = property.Name
                            };

                            EntityInfo.AddEntityField(field);

                            EntityInfo.Setters.Add(property.Name, CreateSetter(property.Name, property.PropertyType));
                            EntityInfo.Getters.Add(property.Name, CreateGetter(property.Name));
                        }
                    }
                }

                EntityTablesInfos.TryAdd(EntityInfo.Table, EntityInfo);

                _isRegistered  = true;
                _isRegistering = false;
            }
        }