none
Asp Identity + MySql RRS feed

  • Вопрос

  • Здравствуйте!

    Возникла необходимость использовать MySql в ASP.MVC5 + EF6 приложении.

    Установил пакеты с нугета: MySql.Data, MySql.Data.EF6, MySql.Web.

    В Web.config:

      <connectionStrings>
        <add name="Ef6DatabaseContext" connectionString="***" providerName="MySql.Data.MySqlClient" />
      </connectionStrings>
      <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
        <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>-->
    
        <!--<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />-->
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
        </providers>
      </entityFramework>


    Ef6DatabaseContext:

        [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
        public class Ef6DatabaseContext : IdentityDbContext<ApplicationUser>
        {
            public Ef6DatabaseContext()
                : base("Ef6DatabaseContext")
            {
            }
    
            public DbSet<User> CustomUsers { get; set; }
            public DbSet<Project> Projects { get; set; }
        
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Configurations.Add(new UserMap());
                modelBuilder.Configurations.Add(new ProjectMap());
            }
        }


    Создал миграцию MySqlIdentity (обратите внимание на закоментированные строчки):

        public partial class MySqlIdentity : DbMigration
        {
            public override void Up()
            {
                CreateTable(
                    "dbo.Users",
                    c => new
                        {
                            UserId = c.Int(nullable: false, identity: true),
                            FirstName = c.String(unicode: false),
                            LastName = c.String(unicode: false),
                        })
                    .PrimaryKey(t => t.UserId);
                
                CreateTable(
                    "dbo.Projects",
                    c => new
                        {
                            ProjectId = c.Int(nullable: false, identity: true),
                            UserId = c.Int(nullable: false),
                            ProjectName = c.String(unicode: false),
                        })
                    .PrimaryKey(t => t.ProjectId)
                    .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
                    .Index(t => t.UserId);
                
                CreateTable(
                    "dbo.AspNetRoles",
                    c => new
                        {
                            Id = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                            Name = c.String(nullable: false, maxLength: 256, storeType: "nvarchar"),
                        })
                    .PrimaryKey(t => t.Id)
                    ;//.Index(t => t.Name, unique: true, name: "RoleNameIndex");
    
                CreateTable(
                    "dbo.AspNetUserRoles",
                    c => new
                        {
                            UserId = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                            RoleId = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                        })
                    .PrimaryKey(t => new { t.UserId, t.RoleId })
                    .ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
                    .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                    .Index(t => t.UserId)
                    .Index(t => t.RoleId);
    
                CreateTable(
                    "dbo.AspNetUsers",
                    c => new
                        {
                            Id = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                            Email = c.String(maxLength: 256, storeType: "nvarchar"),
                            EmailConfirmed = c.Boolean(nullable: false),
                            PasswordHash = c.String(unicode: false),
                            SecurityStamp = c.String(unicode: false),
                            PhoneNumber = c.String(unicode: false),
                            PhoneNumberConfirmed = c.Boolean(nullable: false),
                            TwoFactorEnabled = c.Boolean(nullable: false),
                            LockoutEndDateUtc = c.DateTime(precision: 0),
                            LockoutEnabled = c.Boolean(nullable: false),
                            AccessFailedCount = c.Int(nullable: false),
                            UserName = c.String(nullable: false, maxLength: 256, storeType: "nvarchar"),
                            User_UserId = c.Int(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Users", t => t.User_UserId)
                    //.Index(t => t.UserName, unique: true, name: "UserNameIndex")
                    .Index(t => t.User_UserId);
                
                CreateTable(
                    "dbo.AspNetUserClaims",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            UserId = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                            ClaimType = c.String(unicode: false),
                            ClaimValue = c.String(unicode: false),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                    .Index(t => t.UserId);
                
                CreateTable(
                    "dbo.AspNetUserLogins",
                    c => new
                        {
                            LoginProvider = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                            ProviderKey = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                            UserId = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                        })
                    .PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
                    .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                    .Index(t => t.UserId);
                
            }


    Вот при таких условиях все хорошо работает, но у меня возникла проблема, я был вынужден закоментировать создание индексов: 

    //.Index(t => t.Name, unique: true, name: "RoleNameIndex");
    
    //.Index(t => t.UserName, unique: true, name: "UserNameIndex")

    Без этого получаю эксепшн при применении миграции:

     System.Runtime.Serialization.SerializationException: Type is not resolved for member 'MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d'.

       at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
       at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
       at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
       at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
       at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)


    Как решить проблему?

    Спасибо.


    7 апреля 2014 г. 14:45

Ответы

  • Возможно это связано с конкретным типом движком таблиц. На некоторых есть ограничения. Можете поменять тип. Тут вроде про это написано. "Prefix support and lengths of prefixes (where supported) are storage engine dependent. For example, a prefix can be up to 1000 bytes long for MyISAM tables, and 767 bytes for InnoDB tables." С MySql давно не работал, если честно.

    Сделаем содержимое сообщества лучше, вместе!

    8 апреля 2014 г. 8:36
    Модератор

Все ответы

  • Сгенерировал SQL, выполнил его вручную и более подробно увидел ошибку: Specified key was too long; max key length is 767 bytes

    8 апреля 2014 г. 7:32
  • Возможно это связано с конкретным типом движком таблиц. На некоторых есть ограничения. Можете поменять тип. Тут вроде про это написано. "Prefix support and lengths of prefixes (where supported) are storage engine dependent. For example, a prefix can be up to 1000 bytes long for MyISAM tables, and 767 bytes for InnoDB tables." С MySql давно не работал, если честно.

    Сделаем содержимое сообщества лучше, вместе!

    8 апреля 2014 г. 8:36
    Модератор