Nano Hash - криптовалюты, майнинг, программирование

Ошибка идентификации (при создании базы данных) указанный ключ слишком длинный

У меня есть проблема с AspNet Identity и MySql, проблема в ошибке, которая действительно блокирует меня, эта ошибка следующая:

указанный ключ был слишком длинным максимальная длина ключа 767 байт

Теперь я следовал этому руководству по использованию MySql с идентификацией:

http://www.asp.net/mvc/tutorials/security/aspnet-identity-using-mysql-storage-with-an-entityframework-mysql-provider

Я хочу сказать, что у меня был прогресс, потому что теперь, по крайней мере, я получаю некоторые таблицы, сгенерированные в MySQL, но я стек по этой проблеме, долгое время пытаюсь решить это, но безуспешно.

Ошибка, которую я получаю, находится в этой части:

 public void InitializeDatabase(ApplicationDbContext context)
        {
            if (!context.Database.Exists())
            {
                // if database did not exist before - create it
                context.Database.Create();
            }
            else
            {
                // query to check if MigrationHistory table is present in the database 
                var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
                string.Format(
                  "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",
                  "Server=127.0.0.1;Database=mydb;uid=root;pwd=mypass;port=3351;"));

                // if MigrationHistory table is not there (which is the case first time we run) - create it
                if (migrationHistoryTableExists.FirstOrDefault() == 0)
                {
                    context.Database.Delete();
                    context.Database.Create(); //<<<< i get here error
                }
            }
        }

Так что это выдает ошибку: context.Database.Create();

Я пытался выяснить, в чем именно проблема, но я не мог найти :(

Я попытался сравнить данные в базе данных, сгенерированной сервером sql, и поместить ту же информацию в таблицу миграции, и обычно я могу поместить туда те же значения из инструкции вставки в рабочей среде.

Может быть, кто-нибудь может помочь мне пройти через это?

Просто заметьте, что в конце все таблицы создаются, но ничего не вставляется из-за ошибки:/

Вот все таблицы, созданные в схеме mysql: столбцы mysql

У меня есть небольшое обновление: кажется, что он пытается сделать комбинированный ПК из двух столбцов migrationId и contextkey, поэтому вы получаете такую ​​​​ошибку.

Я мог воспроизвести это на своем рабочем месте, я попытался изменить таблицу, установив эти столбцы как PK, и я получил точно такую ​​​​же ошибку. Но как сказать, что например должен быть установлен только 1 ПК?


  • Я думаю, что ваша проблема связана с этим: bugs.mysql.com/bug.php?id =68453 Для InnoDB по умолчанию ключ индекса для индекса с одним столбцом может иметь размер до 767 байт. Если это уникальный ключ, выдается эта ошибка; если он не уникален, он автоматически усекается. 12.01.2014
  • Но я попытался добавить туда некоторые значения, и все было в порядке ... я не знаю, насколько большой материал он пытается добавить туда ... и также я установил ограничение на эти поля, если вы проверили учебник 12.01.2014
  • Каков размер столбца aspnetUsers.UserName в базе данных? 12.01.2014
  • как вы можете видеть, имя пользователя является длинным текстом 12.01.2014
  • Один из ответов здесь сработал для меня: stackoverflow.com/questions/24981593/ 22.08.2014

Ответы:


1

Эта проблема вызвана слишком длинными столбцами UTF-8, которые используются в качестве индексов. Лучший способ решить эту проблему — использовать другой движок базы данных, но это, вероятно, не то, что вы хотите услышать. Второй вариант — обновить схему базы данных, чтобы уменьшить ограничение на количество символов в индексируемых полях.

http://wildlyinaccurate.com/mysql-specified-key-was-too-long-max-key-length-is-767-bytes

EDIT: ошибка обсуждается здесь: http://bugs.mysql.com/bug.php?id=70940 . Последнее сообщение, кажется, предлагает жизнеспособное решение.

12.01.2014
  • Я уже проверил эту ссылку, но, как я уже говорил в учебнике, я установил ограничение для этих столбцов и проверил, что добавляемые значения не такие большие, и я могу добавить их вручную... 12.01.2014
  • Не могли бы вы опубликовать проблеск схемы базы данных? Из-за размера символов UTF умножение может легко превысить разрешенный размер столбца, но необычно, что вы можете добавить их вручную. В новейшей схеме ничего не изменилось? 12.01.2014
  • Хорошо, я разместил изображение всех создаваемых столбцов. 12.01.2014
  • По-видимому, проблемы вызывает столбец ContextKey, но я не уверен, что можно изменить размер... 12.01.2014
  • Обновил мой ответ ссылкой на центр ошибок MySQL, похоже, у них есть решение 12.01.2014
  • Хорошо, но то, что они предложили, я использую в учебнике, если вы видели код, у меня точно такой же... 12.01.2014
  • Я обновил свой пост, я думаю, что эта проблема возникает при установке двух первичных ключей. 12.01.2014
  • Хорошо, это было решено честно, это была глупая ошибка, у меня было это: base.OnModelCreating(modelBuilder); после моего кода, который, как я предполагал, все мои перезаписанные действия проигнорировали :) 12.01.2014
  • Поздравляю с решением :-)! Это действительно то, что можно легко пропустить .. 12.01.2014

  • 2

    Проверив SQL-запросы, сгенерированные EF, я обнаружил, что проблема связана с именем пользователя (varchar utf8 256) в таблице AspNetUsers и именем (varchar utf8 256) в таблице AspNetRoles, тогда как таблица для HistoryRow была в порядке.

    Таким образом, следующие коды решили проблему.

        public class WebPortalDbContext : IdentityDbContext<ApplicationUser>
    {
        public WebPortalDbContext()
            : base("IdentityConnection")
        {
    
        }
    
        public static WebPortalDbContext Create()
        {
            return new WebPortalDbContext();
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>()
                .Property(c => c.Name).HasMaxLength(128).IsRequired();
    
            modelBuilder.Entity<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>().ToTable("AspNetUsers")//I have to declare the table name, otherwise IdentityUser will be created
                .Property(c => c.UserName).HasMaxLength(128).IsRequired();
        }
    
    
    }
    

    Чтобы прояснить решение, вот библиотеки, которые я использую:

    1. EF 6.1.0
    2. Идентификация Microsoft ASP.NET EntityFramework 2.0.0
    3. Идентификация ASP.NET Owin 2.0.0
    4. Библиотеки MySql .NET 6.8.3

    И это решение также работает для

    1. EF 6.1.1
    2. Идентификация Microsoft ASP.NET EntityFramework 2.0.1
    3. Идентификация ASP.NET Owin 2.0.1
    25.06.2014
  • Мне удалось установить maxlength на 255 (по умолчанию 256). Мы не должны забывать воссоздать первоначальную явную миграцию после изменения конфигураций построителя моделей в нашем производном dbcontext. 01.08.2014
  • Вам нужно изменить IdentityUser на ApplicationUser, чтобы это работало. 13.03.2015

  • 3

    Просто выстрел в темноте... Я думаю, что столбец, который создается для Application.UserName, слишком велик для уникального индекса. Посмотрите, можете ли вы повлиять на его размер, переопределив значение по умолчанию:

    public class ApplicationUser : IdentityUser
    {
      [StringLength(200)]
      public override string UserName { get; set; }   
    }
    
    12.01.2014
  • Нет, это не имя пользователя, я проверил его сейчас, и я получаю ту же ошибку, а затем снова имя пользователя, которое я предоставляю себе, и это всего лишь 4 буквы «тест», я думаю, что это больше таблица истории миграции, но да ... 12.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..