3

我正在尝试: 使用 ASP.NET MVC 4默认 Web 应用程序对 MySQL 使用基于简单成员资格提供程序的身份验证,该应用程序配置为使用 MySQL 提供的教程: http ://www.nsilverbullet.net/2012/11/07/6-步骤获取实体框架 5-working-with-mysql-5-5/

在这里使用 MySQL 的 ASP.NET MVC 4 EF5

我正在使用带有EF 5.0Visual Studio 2012的MySQL 连接器 6.6.4 ,并使用ASP.NET MVC 4 Internet 应用程序模板。

我面临的错误是这样的:

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

我在这里提供了一个类似问题的答案: Using Simple Membership Provider with mysql 它基于我在这里找到的 Fabio Costa 的一篇文章:http: //fabiocosta.ca/2012/11/24/use-simplemembership-and-oauth-使用任何数据库和数据类型/。您基本上获得了源代码,根据您的需要对其进行更新(让它编写 mysql 查询而不是 sql)并使用它。

于 2013-04-04T02:31:20.570 回答
1

您可能确实可以将 MySQL 与 EF 一起使用,就像我自己做的那样,但似乎不支持 Simple Membership Provider。

阅读这篇文章底部的答案: http ://forums.asp.net/t/1766451.aspx/1

于 2013-02-19T15:13:15.247 回答
-1

请查看https://mysqlmembershipprovider.codeplex.com/

并且提供程序也是使用 EF 实现的,并且默认构建在 .NET 4.5 上。

于 2014-06-30T23:35:02.557 回答