8

Entity Framework бросает это исключение:Попытка установить непустой строки к типу «System.Int32»

Свойство «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 Nullable, но но безрезультатно.

+0

Ваши 'PasswordIterations' определены как' Nullable '. Поэтому, очевидно, вы не можете использовать строку. – Rahul

+0

Дело в том, что я вообще не использую ничью. Это всегда int. –

+0

Я сомневаюсь, что это та линия, которая бросает исключение. Ты уверен? – Rahul

ответ

7

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

+1

Спасибо. У меня был public int foo вместо public string foo. геэз. – JoshYates1980

2

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

+0

Я установил его как nullable, чтобы попытаться исправить проблему. Первоначально он не был нулевым - я обновил свой пример, чтобы показать это. –

8

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

+0

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

+1

Я поместил вашу опубликованную схему и модель EF в свое решение, и она отлично поработала. Затем я изменил тип базы данных PasswordIterations на varchar и получил точное исключение, которое вы показываете выше. Этот ответ почти наверняка является правильным ответом, поэтому я бы удвоил и утроил ваши строки подключения. Кроме того, запуск SQL Server Profiler станет отличным шагом. Если он не показывает никакой активности, то ваш проект не подключается к db, который вы так думаете. – Grax

+0

Вы были правы. Он подключался к некоторой случайной базе данных. –

1

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

3

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

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

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

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

0

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

0

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

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

public string foo { get; set; } 

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

public int foo { get; set; } 

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

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

0

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

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

open web.co nfig, и вы обнаружите, что ваша строку соединения


также проверить, есть ли обнуляемый столбец в базе данных реализовать в своем классе следующим образом: для экс: публичный Int? WorkedYears {get; задавать; }
EFCode First Property Null problem

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^