public bool CreateIfNotExist() {
            var TableNames = new Dictionary<Type, TableAttribute>();
            var cnn = "";
            if (MembershipProvider != null) {
                if (MembershipProvider.GetType().GetGenericTypeDefinition() != typeof(EFMembershipProvider<,>))
                    throw new ArgumentException("INSTALL_Invalid_membership_provider_type".Resource());

                dynamic tablePrefix = ((dynamic)MembershipProvider).TablePrefix;
                dynamic tableSchema = ((dynamic)MembershipProvider).TableSchema;
                dynamic helper = ((dynamic)MembershipProvider).Helper;
                cnn = ((dynamic)MembershipProvider).ConnectionString;
                foreach (var item in (Dictionary<Type, TableAttribute>)helper.TableNames)
                    TableNames[item.Key] = item.Value;

                var propAppType = (PropertyInfo)helper.Get(Mapper.UserColumnType.Application);
                if (propAppType != null) {
                    var appType = propAppType.PropertyType;

                    var tblNameAttr = appType.GetCustomAttributes(typeof(TableAttribute), true);
                    var noPrefixAttr = appType.GetCustomAttributes(typeof(NoPrefixAttribute), true);

                    var ApplicationTableNoPrefix = noPrefixAttr != null && noPrefixAttr.Length > 0;
                    var first = tblNameAttr.FirstOrDefault() as TableAttribute;

                    TableAttribute ApplicationTableName;
                    if (first != null)
                        ApplicationTableName = first;
                    else
                        ApplicationTableName = new TableAttribute(appType.Name.Trim().Replace(" ", ""));
                    if (!string.IsNullOrEmpty(tableSchema)) ApplicationTableName.Schema = tableSchema;

                    if (!ApplicationTableNoPrefix && !string.IsNullOrWhiteSpace(tablePrefix)) {
                        var schema = ApplicationTableName.Schema;
                        ApplicationTableName = new TableAttribute(tablePrefix + ApplicationTableName.Name);
                        if (schema != null) ApplicationTableName.Schema = schema;
                    }

                    TableNames[appType] = ApplicationTableName;
                }
            }

            if (RoleProvider != null) {
                if (RoleProvider.GetType().GetGenericTypeDefinition() != typeof(EFRoleProvider<,,>))
                    throw new ArgumentException("INSTALL_Invalid_role_provider_type".Resource());

                dynamic tablePrefix = ((dynamic)RoleProvider).TablePrefix;
                dynamic tableSchema = ((dynamic)RoleProvider).TableSchema;
                dynamic helper1 = ((dynamic)RoleProvider).RoleHelper;
                if (string.IsNullOrEmpty(cnn))
                    cnn = ((dynamic)RoleProvider).ConnectionString;

                foreach (var item in (Dictionary<Type, TableAttribute>)helper1.TableNames)
                    TableNames[item.Key] = item.Value;

                dynamic helper2 = ((dynamic)RoleProvider).UserRoleHelper;
                foreach (var item in (Dictionary<Type, TableAttribute>)helper2.TableNames)
                    TableNames[item.Key] = item.Value;

                var propAppType = (PropertyInfo)helper1.Get(Mapper.RoleColumnType.Application);
                if (propAppType != null) {
                    var appType = propAppType.PropertyType;

                    var tblNameAttr = appType.GetCustomAttributes(typeof(TableAttribute), true);
                    var noPrefixAttr = appType.GetCustomAttributes(typeof(NoPrefixAttribute), true);

                    var ApplicationTableNoPrefix = noPrefixAttr != null && noPrefixAttr.Length > 0;
                    var first = tblNameAttr.FirstOrDefault() as TableAttribute;

                    TableAttribute ApplicationTableName;
                    if (first != null)
                        ApplicationTableName = first;
                    else
                        ApplicationTableName = new TableAttribute(appType.Name.Trim().Replace(" ", ""));
                    if (!string.IsNullOrEmpty(tableSchema)) ApplicationTableName.Schema = tableSchema;

                    if (!ApplicationTableNoPrefix && !string.IsNullOrWhiteSpace(tablePrefix)) {
                        var schema = ApplicationTableName.Schema;
                        ApplicationTableName = new TableAttribute(tablePrefix + ApplicationTableName.Name);
                        if (schema != null) ApplicationTableName.Schema = schema;
                    }

                    TableNames[appType] = ApplicationTableName;
                }
            }

            var internalContext = new InternalInstallDataContext(cnn);
            internalContext.TableNames = TableNames;
            return internalContext.Database.CreateIfNotExists();
        }
        public bool CreateIfNotExist()
        {
            var TableNames = new Dictionary <Type, TableAttribute>();
            var cnn        = "";

            if (MembershipProvider != null)
            {
                //if (MembershipProvider.GetType().GetGenericTypeDefinition() != typeof(EFMembershipProvider<,,>))
                //    throw new ArgumentException("INSTALL_Invalid_membership_provider_type".Resource());

                dynamic tablePrefix = ((dynamic)MembershipProvider).TablePrefix;
                dynamic tableSchema = ((dynamic)MembershipProvider).TableSchema;
                dynamic helper      = ((dynamic)MembershipProvider).Helper;
#if USE_WEBMATRIX
                dynamic helper_oauth = ((dynamic)MembershipProvider).Helper_OAuth;

                foreach (var item in (Dictionary <Type, TableAttribute>)helper_oauth.TableNames)
                {
                    TableNames[item.Key] = item.Value;
                }
#endif
                cnn = ((dynamic)MembershipProvider).ConnectionString;
                foreach (var item in (Dictionary <Type, TableAttribute>)helper.TableNames)
                {
                    TableNames[item.Key] = item.Value;
                }

                var propAppType = (PropertyInfo)helper.Get(Mapper.UserColumnType.Application);
                if (propAppType != null)
                {
                    var appType = propAppType.PropertyType;

                    var tblNameAttr  = appType.GetCustomAttributes(typeof(TableAttribute), true);
                    var noPrefixAttr = appType.GetCustomAttributes(typeof(NoPrefixAttribute), true);

                    var ApplicationTableNoPrefix = noPrefixAttr != null && noPrefixAttr.Length > 0;
                    var first = tblNameAttr.FirstOrDefault() as TableAttribute;

                    TableAttribute ApplicationTableName;
                    if (first != null)
                    {
                        ApplicationTableName = first;
                    }
                    else
                    {
                        ApplicationTableName = new TableAttribute(appType.Name.Trim().Replace(" ", ""));
                    }
                    if (!string.IsNullOrEmpty(tableSchema))
                    {
                        ApplicationTableName.Schema = tableSchema;
                    }

                    if (!ApplicationTableNoPrefix && !string.IsNullOrWhiteSpace(tablePrefix))
                    {
                        var schema = ApplicationTableName.Schema;
                        ApplicationTableName = new TableAttribute(tablePrefix + ApplicationTableName.Name);
                        if (schema != null)
                        {
                            ApplicationTableName.Schema = schema;
                        }
                    }

                    TableNames[appType] = ApplicationTableName;
                }
            }

            if (RoleProvider != null)
            {
                //if (RoleProvider.GetType().GetGenericTypeDefinition() != typeof(EFRoleProvider<,,>))
                //    throw new ArgumentException("INSTALL_Invalid_role_provider_type".Resource());

                dynamic tablePrefix = ((dynamic)RoleProvider).TablePrefix;
                dynamic tableSchema = ((dynamic)RoleProvider).TableSchema;
                dynamic helper1     = ((dynamic)RoleProvider).RoleHelper;
                if (string.IsNullOrEmpty(cnn))
                {
                    cnn = ((dynamic)RoleProvider).ConnectionString;
                }

                foreach (var item in (Dictionary <Type, TableAttribute>)helper1.TableNames)
                {
                    TableNames[item.Key] = item.Value;
                }

                dynamic helper2 = ((dynamic)RoleProvider).UserRoleHelper;
                foreach (var item in (Dictionary <Type, TableAttribute>)helper2.TableNames)
                {
                    TableNames[item.Key] = item.Value;
                }

                var propAppType = (PropertyInfo)helper1.Get(Mapper.RoleColumnType.Application);
                if (propAppType != null)
                {
                    var appType = propAppType.PropertyType;

                    var tblNameAttr  = appType.GetCustomAttributes(typeof(TableAttribute), true);
                    var noPrefixAttr = appType.GetCustomAttributes(typeof(NoPrefixAttribute), true);

                    var ApplicationTableNoPrefix = noPrefixAttr != null && noPrefixAttr.Length > 0;
                    var first = tblNameAttr.FirstOrDefault() as TableAttribute;

                    TableAttribute ApplicationTableName;
                    if (first != null)
                    {
                        ApplicationTableName = first;
                    }
                    else
                    {
                        ApplicationTableName = new TableAttribute(appType.Name.Trim().Replace(" ", ""));
                    }
                    if (!string.IsNullOrEmpty(tableSchema))
                    {
                        ApplicationTableName.Schema = tableSchema;
                    }

                    if (!ApplicationTableNoPrefix && !string.IsNullOrWhiteSpace(tablePrefix))
                    {
                        var schema = ApplicationTableName.Schema;
                        ApplicationTableName = new TableAttribute(tablePrefix + ApplicationTableName.Name);
                        if (schema != null)
                        {
                            ApplicationTableName.Schema = schema;
                        }
                    }

                    TableNames[appType] = ApplicationTableName;
                }
            }

            var internalContext = new InternalInstallDataContext(cnn);
            internalContext.TableNames = TableNames;


            //System.Data.Entity.Migrations.DbMigrator mig = new System.Data.Entity.Migrations.DbMigrator()
            //mig.Update();

            return(internalContext.Database.CreateIfNotExists());
        }