Попытка установить ненулевую строку для ввода 'System.Int32'

Entity Framework выбрасывает это исключение:

Свойство "PasswordIterations" в "BranchIdentity" не может быть установлено в значение "System.String". Вы должны установить это свойство в ненулевое значение типа "System.Int32".

Он бросает эту строку:

// Validate uniqueness or email and username
var user = sqlStorage.BranchIdentities.FirstOrDefault(i => i.Username.ToLower() == viewModel.Username.ToLower());

Исключение составляет только то, когда существует сущность, которая соответствует запросу. Если совпадений нет, исключение не выбрасывается.

Моя модель BranchIdentity:

namespace Branch.Models.Sql
{
    public class BranchIdentity
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Username { get; set; }

        [Required]
        public string PasswordHash { get; set; }

        [Required]
        public string PasswordSalt { get; set; }

        [Required]
        public int PasswordIterations { get; set; }

        [Required]
        public string Email { get; set; }

        [Required]
        public string FullName { get; set; }

        public virtual ICollection<BranchIdentitySession> BranchIdentitySessions { get; set; } 

        public virtual BranchRole BranchRole { get; set; }

        public virtual GamerIdentity GamerIdentity { get; set; }
    }
}

И моя схема (взята из базы данных sql) - автоматически сгенерирована с использованием первых кодов миграции:

CREATE TABLE [dbo].[BranchIdentities] (
    [Id]                 INT            IDENTITY (1, 1) NOT NULL,
    [Username]           NVARCHAR (MAX) NOT NULL,
    [PasswordHash]       NVARCHAR (MAX) NOT NULL,
    [PasswordSalt]       NVARCHAR (MAX) NOT NULL,
    [PasswordIterations] INT            NOT NULL,
    [Email]              NVARCHAR (MAX) NOT NULL,
    [BranchRole_Id]      INT            NULL,
    [GamerIdentity_Id]   INT            NULL,
    [FullName]           NVARCHAR (MAX) DEFAULT ('') NOT NULL,
    CONSTRAINT [PK_dbo.BranchIdentities] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.BranchIdentities_dbo.BranchRoles_BranchRole_Id] FOREIGN KEY ([BranchRole_Id]) REFERENCES [dbo].[BranchRoles] ([Id]),
    CONSTRAINT [FK_dbo.BranchIdentities_dbo.GamerIdentities_GamerIdentity_Id] FOREIGN KEY ([GamerIdentity_Id]) REFERENCES [dbo].[GamerIdentities] ([Id])
);

Я попробовал сделать PasswordIterations нулевым, но безрезультатно.

Ответы

Ответ 1

Просто для тех, у кого есть проблемы с этим. Установите контрольную точку в DatabaseContext и убедитесь, что она подключена к правильной базе данных. Моя была переписана из файла web.config, о котором я забыл.

Ответ 2

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

Ответ 3

Я столкнулся с этим сообщением SO на пути к решению подобной проблемы.

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

EF, казалось, взял первый бит найденного кода результата, который вернул строку.

Я исправил это, если sproc возвращает строку в любом случае.

Ответ 4

Если он недействителен, почему вы его отметили как необходимо? Удалите требуемый флаг и он должен вести себя так, как ожидалось.

Ответ 5

У меня была аналогичная проблема с импортом proc в EF-модель, и оказалось, что инструкция select изменилась.EF увидела поле результата в виде строки, а не int, которое было определено в исходной сгенерированной модели. Мы должны были явно передать поле в proc в int, и все снова были счастливы.

Ответ 6

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

Перед изменением

public string foo { get; set; }

После изменения

public int foo { get; set; }

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

Замените нулевые значения в таблице числом (например: 0)

Ответ 7

в моей реальной базе данных мое поле было нулевым, но в моей модели в коде мое поле было простым int. Я изменил его на int? (nullable int), и теперь он работает отлично.

Ответ 8

Имела та же проблема с View. С явным приведением в nvarchar проблемного столбца в сценарии представления и обновлением модели было исправлено

Ответ 9

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

убедитесь, что вы ввели правильное соединение с базой данных, и вы можете сделать С# сгенерировать строку подключения для вас:
добавьте новый элемент → Данные → объект данных ADO.Net datamodel → сначала код из базы данных ---> Новое соединение ---> и укажите ваши параметры и тестовое соединение → ok → ok - > до конца

откройте web.config, и вы найдете строку подключения


также проверьте, существует ли в базе данных нулевой столбец, реализующий его в своем классе следующим образом: для ex: public int? WorkedYears {get; set; задавать; } }
ref: свойство EFCode First Property Null

Ответ 10

Возможно, это поможет кому-то, ошибка, которую я видел, была:

Свойство "Taller" в "ApplicationUser" не может быть установлено в значение "System.Int32". Вы должны установить это свойство в ненулевое значение типа "System.String".

В моем случае я изменил тип столбца Taller в моей базе данных User Table, я также изменил это в своей модели EF. Но если вы используете личность, вы также должны проверить, что вы используете usermanager (IdentityModels), прежде чем вы определяете пользовательские столбцы для своей таблицы пользователей.