private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration)
        {
            DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder;

            var hash               = configuration.GetSha1();
            var assemblyName       = new AssemblyName(typeDescriptorProvider.DataAccessModelType.Assembly.GetName().Name + "." + typeDescriptorProvider.DataAccessModelType.Name);
            var sharedAssemblyName = new AssemblyName("Shaolinq.GeneratedDataAccessModel");
            var assemblyBuilder    = AppDomain.CurrentDomain.DefineDynamicAssembly(sharedAssemblyName, AssemblyBuilderAccess.RunAndSave);
            var moduleBuilder      = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + "." + hash + ".dll");

            var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder);

            var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder);

            dataAccessModelTypeBuilder.BuildType(typeDescriptorProvider.DataAccessModelType);

            var typeDescriptors = typeDescriptorProvider.GetTypeDescriptors();

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type);
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1));
            }

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type];
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2));
            }

            bool saveConcreteAssembly;

            bool.TryParse(ConfigurationManager.AppSettings["Shaolinq.SaveConcreteAssembly"], out saveConcreteAssembly);

#if DEBUG
            const bool isInDebugMode = true;
#else
            const bool isInDebugMode = false;
#endif

            // ReSharper disable once ConditionIsAlwaysTrueOrFalse
            if (saveConcreteAssembly || isInDebugMode)
            {
                ActionUtils.IgnoreExceptions(() => assemblyBuilder.Save(assemblyName + "." + hash + ".dll"));
            }

            return(assemblyBuilder);
        }
        private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration)
        {
            DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder;

            var configMd5 = configuration.GetMd5();
            var assemblyName = new AssemblyName(typeDescriptorProvider.DataAccessModelType.Assembly.GetName().Name + "." + typeDescriptorProvider.DataAccessModelType.Name);
            var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
            var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + "." + configMd5 + ".dll");

            var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder);

            var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder);
            dataAccessModelTypeBuilder.BuildType(typeDescriptorProvider.DataAccessModelType);

            var typeDescriptors = typeDescriptorProvider.GetTypeDescriptors();

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type);
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1));
            }

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type];
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2));
            }

            bool saveConcreteAssembly;
            bool.TryParse(ConfigurationManager.AppSettings["Shaolinq.SaveConcreteAssembly"], out saveConcreteAssembly);

            #if DEBUG
            const bool isInDebugMode = true;
            #else
            const bool isInDebugMode = false;
            #endif

            if (saveConcreteAssembly || isInDebugMode)
            {
                ActionUtils.IgnoreExceptions(() => assemblyBuilder.Save(assemblyName + "." + configMd5 + ".dll"));
            }

            return assemblyBuilder;
        }