Использование MySql MySQLMembershipProvider - autogenerateschema = "true" не работает? - PullRequest
3 голосов
/ 11 февраля 2010

Я пытаюсь использовать MySQLRoleProvider (MySql.Web, Версия = 6.2.2.0) с Visual Web Developer 2008.

При попытке добавить роль я получаю исключение «Таблица» test.my_aspnet_applications«не существует»

if (!Roles.RoleExists("TestRole"))
{
  Roles.CreateRole("TestRole");
}

Может кто-нибудь сказать мне, где я ошибся.Или скажите мне, как сгенерировать / найти правильный скрипт базы данных для создания роли, членства, профиля ... MySql таблиц.

    <membership defaultProvider="MySQLMembershipProvider">
        <providers>
            <remove name="MySQLMembershipProvider"/>
            <add autogenerateschema="true" connectionStringName="LocalMySqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
        </providers>
    </membership>
    <profile enabled="true" defaultProvider="MySQLProfileProvider">
        <providers>
            <remove name="MySQLProfileProvider"/>
            <add name="MySQLProfileProvider" autogenerateschema="true" type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/"/>
        </providers>
    </profile>
    <roleManager enabled="true" defaultProvider="MySQLRoleProvider">
        <providers>
            <remove name="MySQLRoleProvider"/>
            <add autogenerateschema="true" connectionStringName="LocalMySqlServer" applicationName="/" name="MySQLRoleProvider" type="MySql.Web.Security.MySQLRoleProvider, MySql.Web, Version=6.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
        </providers>
    </roleManager>      

Ответы [ 3 ]

2 голосов
/ 11 февраля 2010

Использовали ли вы инструмент настройки ASP.Net для переключения поставщика вашего приложения на поставщика MySQL? Я считаю, что это то, что провайдер MySQL автоматически генерирует схему.

0 голосов
/ 20 ноября 2015

Выполните этот код проекта, как , и все будет в порядке.

0 голосов
/ 21 ноября 2012

Если ваша база данных не будет генерироваться, попробуйте это:

Создайте пользовательский ContextInitializer и добавьте его в Global.asax:

 Database.SetInitializer(new CreateMySqlDatabaseIfNotExists<MyContext>());

 internal class CreateMySqlDatabaseIfNotExists<TContext>: IDatabaseInitializer<TContext> where TContext : MyContext
{
    public void InitializeDatabase(TContext context)
    {
        if (context.Database.Exists())
        {
            if (!context.Database.CompatibleWithModel(false))
                throw new InvalidOperationException("The model has changed!");
        }
        else
        {
            CreateMySqlDatabase(context);
            Seed(context);
        }
    }

    private void CreateMySqlDatabase(TContext context)
    {
        try
        {
            context.Database.Create();
            return;
        }
        catch (MySqlException ex)
        {
            // Ignore the parse exception
            if (ex.Number != 1064)
            {
                throw;
            }
        }

        // Manually create the metadata table
        using (var connection = ((MySqlConnection) context
                                                       .Database.Connection).Clone())
        using (var command = connection.CreateCommand())
        {
            command.CommandText =
                @"
                CREATE TABLE __MigrationHistory (
                    MigrationId mediumtext NOT NULL,
                    CreatedOn datetime NOT NULL,
                    Model mediumblob NOT NULL,
                    ProductVersion mediumtext NOT NULL);

                ALTER TABLE __MigrationHistory
                ADD PRIMARY KEY (MigrationId(255));

                INSERT INTO __MigrationHistory (
                    MigrationId,
                    CreatedOn,
                    Model,
                    ProductVersion)
                VALUES (
                    'InitialCreate',
                    @CreatedOn,
                    @Model,
                    @ProductVersion);
                ";
            command.Parameters.AddWithValue(
                "@Model",
                GetModel(context));
            command.Parameters.AddWithValue(
                "@ProductVersion",
                GetProductVersion());
            command.Parameters.AddWithValue(
               "@CreatedOn",
               DateTime.Now);

            connection.Open();
            command.ExecuteNonQuery();
        }
    }

    private byte[] GetModel(TContext context)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gzipStream = new GZipStream(
                memoryStream,
                CompressionMode.Compress))
            using (var xmlWriter = XmlWriter.Create(
                gzipStream,
                new XmlWriterSettings {Indent = true}))
            {
                EdmxWriter.WriteEdmx(context, xmlWriter);
            }

            return memoryStream.ToArray();
        }
    }

    private string GetProductVersion()
    {
        return typeof (DbContext).Assembly
            .GetCustomAttributes(false)
            .OfType<AssemblyInformationalVersionAttribute>()
            .Single()
            .InformationalVersion;
    }

    protected void Seed(TContext context)
    { // ...
        context.SaveChanges();
    }
}
...