Entity Framework Core 8 – значение по умолчанию для ID устанавливается в -9223372036854774807 при добавлении объекта.

Вопрос или проблема

У меня есть проект ASP.NET Core 8, использующий Entity Framework Core 8.

Вот мой DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext (DbContextOptions<IguideDbContext> options) : base(options)
    {
    }

    public MyDbContext ()
    {
    }

    public int MyConvertToInt32(long? v)
    {
        return Convert.ToInt32(v);
    }

    public long MyConvertToInt64(int? v)
    {
        return Convert.ToInt64(v);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        var intToLongConverter = new ValueConverter<long, int>(
            v => MyConvertToInt32(v),
            v => MyConvertToInt64(v));
       
        modelBuilder.Entity<UserModel>()
            .Property(t => t.UserId)
            .HasConversion(intToLongConverter);
       //xxxxxx
    }

    public DbSet<UserModel>? Users { get; set; }
}

Вот класс UserModel:

[Table("Users")]
public class UserModel
{
     [Key]
     public long UserId { get; set; }
     public string EmailAddress { get; set; }
     public int  MemberId { get; set; }
     public string Password { get; set; }
}

Вот как я добавляю новый объект в базу данных:

UserModel user = new UserModel();
user.EmailAddress = "aaa";
user.MemberId = 1;
user.Password = "1";

MyDbContext myDbContext = new MyDbContext();
myDbContext.Users.Add(user);

myDbContext.SaveChanges();

При вызове myDbContext.SaveChanges(); возникает эта ошибка:

Значение было либо слишком большим, либо слишком маленьким для Int32.

После расследования я обнаружил, что эта ошибка возникает при вызове метода MyConvertToInt32, потому что он пытается преобразовать -9223372036854774807 в int. Это значение user.UserId?

Оно должно быть 0, потому что я еще не присвоил ему значение. Откуда появляется это огромное значение -9223372036854774807?

Ответ или решение

Вопрос, который вы подняли, касается проблемы с Entity Framework Core 8, связанной с установкой значения по умолчанию для идентификатора (ID) в -9223372036854774807 при добавлении объекта в базу данных. Давайте глубже рассмотрим вашу ситуацию и разберем, что может быть причиной этого поведения и как его исправить.

Контекст проблемы

Ваша реализация класса DbContext и модели UserModel выглядит корректно на первый взгляд. Однако вы сталкиваетесь с проблемой, когда пытаетесь сохранить нового пользователя и получаете ошибку "Значение слишком велико или слишком велико для Int32", когда вызываете метод MyConvertToInt32. Это говорит о том, что в процессе попытки сохранить объект UserModel происходит неожиданное преобразование значения UserId из long в int.

Причина возникновения проблемы

  1. Неправильное значение по умолчанию:
    Значение UserId должно быть инициализировано автоматически при добавлении нового объекта, если вы используете идентификаторы, которые генерируются базой данных. Однако, если это значение в процессе преобразования каким-то образом стало отрицательным и достигло -9223372036854774807, это указывает на проблему, скорее всего, в логике преобразования или конфигурации Entity Framework.

  2. Проблема с преобразованием значения:
    Вы используете ValueConverter для преобразования long в int. Так как long имеет гораздо больший диапазон, чем int, это может привести к нежелательным преобразованиям, когда нецелочисленное значение long будет преобразовано в int. Значение -9223372036854774807, которое у вас возникает, возможно, связано с тем, что UserId не инициализируется как 0, и по умолчанию все значения long могут принимать это странное значение.

Рекомендации по решению проблемы

  1. Измените способ управления значением идентификатора:
    Вместо использования ValueConverter, вы можете оставить UserId как long и использовать автоинкрементные идентификаторы, напрямую полагаясь на механизм базы данных. Убедитесь, что база данных настроена на автоинкремент для колонки UserId.

  2. Инициализация значений:
    Убедитесь, что вы инициализируете UserId при создании нового объекта:

    user.UserId = 0; // Либо просто не устанавливайте, если используется автоинкремент
  3. Проверка конфигурации базы данных:
    Проверьте ваши настройки базы данных: убедитесь, что таблица Users создана с правильными типами данных и что UserId настроен как автоинкрементный (например, в SQL Server это может быть определено как IDENTITY).

  4. Удалите лишние преобразователи:
    Если нет необходимости в преобразовании, рассмотрите возможность удаления свойства ValueConverter из OnModelCreating, чтобы предотвратить ненужные преобразования в будущем.

Заключение

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

Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться за поддержкой!

Оцените материал
Добавить комментарий

Капча загружается...