3

http://www.nsilverbullet.net/2012/11/07/6-で提供されているチュートリアルを使用してMySQLを使用するように構成された ASP.NETMVC4デフォルトWebアプリケーションを使用して、MySQLでシンプルメンバーシッププロバイダーベースの認証を使用しようとして います。 Steps-to-get-entity-framework-5-working-with-mysql-5-5 /

そしてここASP.NETMVC4EF5とMySQL

MySQLConnector6.6.4をEF5.0およびVisualStudio2012で使用しており、ASP.NETMVC4インターネットアプリケーションテンプレートを使用しています。

私が直面しているエラーはこれです:

Server Error in '/' Application.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = 'Z')' at line 1
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = 'Z')' at line 1

Source Error:


Line 55:                     }
Line 56: 
Line 57:                     WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);
Line 58:                 }
Line 59:                 catch (Exception ex)


Source File: e:\Projects\TestApp\TestApp\TestApp\Filters\InitializeSimpleMembershipAttribute.cs    Line: 57

私のコードは次のとおりです。

InitializeSimpleMembershipAttribute.cs

private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                //Database.SetInitializer<UsersContext>(null);
                //Database.SetInitializer(new DropCreateMySqlDatabaseIfModelChanges<UsersContext>());
                //Database.SetInitializer(new CreateMySqlDatabaseIfNotExists<UsersContext>());
                Database.SetInitializer(new DropCreateMySqlDatabaseIfModelChanges<UsersContext>());
                try
                {
                    using (var context = new UsersContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            //((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                            //context.Database.CreateIfNotExists();
                        }
                    }

                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                }
            }

        }

AccountModel.cs(関連コードのみ)

public class UsersContext : DbContext
    {
        static UsersContext()
        {
            //Database.SetInitializer(new DropCreateMySqlDatabaseIfModelChanges<UsersContext>());
        }
        public UsersContext()
            : base("DefaultConnection")
        {
            //Database.SetInitializer(new DropCreateMySqlDatabaseIfModelChanges<UsersContext>());
        }

        public DbSet<UserProfile> UserProfiles { get; set; }
    }
    public class DropCreateMySqlDatabaseAlways<TContext>
      : MySqlDatabaseInitializer<TContext> where TContext : DbContext
    {
        public override void InitializeDatabase(TContext context)
        {
            context.Database.Delete();
            CreateMySqlDatabase(context);
        }
    }

    public class DropCreateMySqlDatabaseIfModelChanges<TContext>
     : MySqlDatabaseInitializer<TContext> where TContext : DbContext
    {
        public override void InitializeDatabase(TContext context)
        {
            bool needsNewDb = false;
            if (context.Database.Exists())
            {
                if (!context.Database.CompatibleWithModel(false))
                {
                    context.Database.Delete();
                    needsNewDb = true;
                }
            }
            else
            {
                needsNewDb = true;
            }
            if (needsNewDb) CreateMySqlDatabase(context);
        }
    }

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

    public abstract class MySqlDatabaseInitializer<TContext>
     : IDatabaseInitializer<TContext>
         where TContext : DbContext
    {
        public abstract void InitializeDatabase(TContext context);

        protected void CreateMySqlDatabase(TContext context)
        {
            try
            {
                // Create as much of the database as we can
                context.Database.Create();

                // No exception? Don't need a workaround
                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,
    Model mediumblob NOT NULL,
    ProductVersion mediumtext NOT NULL);

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

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

                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;
        }
    }

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
    }

    public class RegisterExternalLoginModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        public string ExternalLoginData { get; set; }
    }

    public class LocalPasswordModel
    {
        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Current password")]
        public string OldPassword { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "New password")]
        public string NewPassword { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm new password")]
        [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }

私が間違っていることを見つけるのを手伝ってください。ありがとう

4

3 に答える 3

3

私はここで同様の質問に対する答えを提供しました: mysqlでのシンプルメンバーシッププロバイダーの使用 これは、ここで見つけたFabio Costaの記事に基づいています:http://fabiocosta.ca/2012/11/24/use-simplemembership-and-oauth- with-any-database-and-datatype/。基本的にソースコードを取得し、必要に応じて更新し(sqlではなくmysqlクエリを記述させます)、それを使用します。

于 2013-04-04T02:31:20.570 に答える
1

私自身が行っているように、EFでMySQLを使用できるのは事実かもしれませんが、SimpleMembershipProviderはサポートされていないようです。

この投稿の下部にある回答を読んでください:http: //forums.asp.net/t/1766451.aspx/1

于 2013-02-19T15:13:15.247 に答える
-1

https://mysqlmembershipprovider.codeplex.com/をご覧ください。

プロバイダーもEFを使用して実装され、デフォルトは.NET4.5でビルドされます。

于 2014-06-30T23:35:02.557 に答える