Ответ 1
Просто для тех, у кого есть проблемы с этим. Установите контрольную точку в DatabaseContext
и убедитесь, что она подключена к правильной базе данных. Моя была переписана из файла web.config, о котором я забыл.
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
нулевым, но безрезультатно.
Просто для тех, у кого есть проблемы с этим. Установите контрольную точку в DatabaseContext
и убедитесь, что она подключена к правильной базе данных. Моя была переписана из файла web.config, о котором я забыл.
Похоже, что ваша схема и сущность не совпадают, вы отправили код сгенерированный кодом, но это могло измениться с момента создания таблицы. взгляните на таблицу в SQL Server Manager и дважды проверьте тип данных для этого столбца.
Я столкнулся с этим сообщением SO на пути к решению подобной проблемы.
Я обнаружил, что у моей хранимой процедуры была условная логика, которая могла бы вернуть строку или int для первого столбца в результирующем наборе.
EF, казалось, взял первый бит найденного кода результата, который вернул строку.
Я исправил это, если sproc возвращает строку в любом случае.
Если он недействителен, почему вы его отметили как необходимо? Удалите требуемый флаг и он должен вести себя так, как ожидалось.
У меня была аналогичная проблема с импортом proc в EF-модель, и оказалось, что инструкция select изменилась.EF увидела поле результата в виде строки, а не int, которое было определено в исходной сгенерированной модели. Мы должны были явно передать поле в proc в int, и все снова были счастливы.
Возможность такой ошибки, которую я видел после изменения типа данных из string
в int
.
Перед изменением
public string foo { get; set; }
После изменения
public int foo { get; set; }
Перед этим изменением string
позволит вставить в таблицу null
значения. После изменения эти старые значения могут стать причиной возникновения таких ошибок.
в моей реальной базе данных мое поле было нулевым, но в моей модели в коде мое поле было простым int. Я изменил его на int? (nullable int), и теперь он работает отлично.
Имела та же проблема с View. С явным приведением в nvarchar проблемного столбца в сценарии представления и обновлением модели было исправлено
Вопрос разрешен, но может быть полезным для кого-то другого:
убедитесь, что вы ввели правильное соединение с базой данных, и вы можете сделать С# сгенерировать строку подключения для вас:
добавьте новый элемент → Данные → объект данных ADO.Net datamodel → сначала код из базы данных ---> Новое соединение ---> и укажите ваши параметры и тестовое соединение → ok → ok - > до конца
откройте web.config, и вы найдете строку подключения
также проверьте, существует ли в базе данных нулевой столбец, реализующий его в своем классе следующим образом: для ex: public int? WorkedYears {get; set; задавать; } }
ref: свойство EFCode First Property Null
Возможно, это поможет кому-то, ошибка, которую я видел, была:
Свойство "Taller" в "ApplicationUser" не может быть установлено в значение "System.Int32". Вы должны установить это свойство в ненулевое значение типа "System.String".
В моем случае я изменил тип столбца Taller в моей базе данных User Table, я также изменил это в своей модели EF. Но если вы используете личность, вы также должны проверить, что вы используете usermanager (IdentityModels), прежде чем вы определяете пользовательские столбцы для своей таблицы пользователей.