Пример #1
0
        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            EntitySerializer entitySerializer = serializer as EntitySerializer;

            if (entitySerializer != null)
            {
                entitySerializer.SessionCreator = null;
            }

            serializer = null;
        }
Пример #2
0
 public abstract void Serialize(IDatabaseSettings settings, EntitySerializer serializer, Relation rel, object instanceEntity, PropertyAccessor pInfo, EntityMap entityMap, EntityAccessor entityAccessor, DbDataReader dbReader);
Пример #3
0
        public override void Serialize(IDatabaseSettings settings, EntitySerializer serializer, Relation rel, object instanceEntity, PropertyAccessor pInfo, EntityMap entityMap, EntityAccessor entityAccessor, DbDataReader dbReader)
        {
            var propType      = pInfo.PropertyType;
            var relEntMap     = entityMap.Parent.GetEntityMap(rel.ReferenceEntityName);
            var refEntityType = propType.GetGenericArguments().FirstOrDefault();

            if (refEntityType == null)
            {
                throw new MappingException(string.Format("property type mismatch: {0} should be IList<T>", rel.PropertyName));
            }

            var prop = entityMap.FirstOrDefault(c => c.ColumnName == rel.ColumnName);

            if (prop == null)
            {
                throw new GoliathDataException(string.Format("{0}: Reference {1} does not have matching property.", entityMap.FullName, rel.PropertyName));
            }


            if (propType == typeof(IList <>).MakeGenericType(new Type[] { refEntityType }))
            {
                var valAccessor = entityAccessor.GetPropertyAccessor(prop.PropertyName);
                var val         = valAccessor.GetMethod(instanceEntity);

                if (val != null)
                {
                    var relCols = new List <string>();
                    var session = serializer.SessionCreator();

                    int iteration = 0;
                    int recursion = 0;

                    var relQueryMap = new TableQueryMap(relEntMap.FullName, ref recursion, ref iteration);

                    QueryBuilder q = new QueryBuilder(session, relCols);
                    relQueryMap.LoadColumns(relEntMap, session, q, relCols);
                    q.QueryMap = relQueryMap;

                    var queryBuilder = q.From(relEntMap.TableName, relQueryMap.Prefix)
                                       .InnerJoin(rel.MapTableName, "m_t1")
                                       .On(relQueryMap.Prefix, rel.MapReferenceColumn)
                                       .EqualTo(rel.MapPropertyName)
                                       .InnerJoin(entityMap.TableName, "e_t1")
                                       .On("m_t1", "m_t1." + rel.MapColumn)
                                       .EqualTo("e_t1." + rel.MapPropertyName)
                                       .Where("m_t1", rel.MapColumn).EqualToValue(val) as QueryBuilder;



                    var collectionType = typeof(Collections.LazyList <>).MakeGenericType(new Type[] { refEntityType });
                    var lazyCol        = Activator.CreateInstance(collectionType, queryBuilder, relEntMap, serializer, session);
                    pInfo.SetMethod(instanceEntity, lazyCol);
                }
                else
                {
                    var collectionType = typeof(List <>).MakeGenericType(new Type[] { refEntityType });
                    pInfo.SetMethod(instanceEntity, Activator.CreateInstance(collectionType));
                }
            }
            else
            {
                throw new MappingException(string.Format("property type mismatch: {0} should be IList<T>", rel.PropertyName));
            }
        }