web-dev-qa-db-fra.com

Essayer de définir une chaîne non nulle pour taper 'System.Int32'

Entity Framework lève cette exception:

La propriété 'PasswordIterations' sur 'BranchIdentity' n'a pas pu être définie sur une valeur 'System.String'. Vous devez définir cette propriété sur une valeur non nulle du type 'System.Int32'.

C'est jeter sur cette ligne:

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

L'exception est levée uniquement lorsqu'une entité correspond à la requête. S'il n'y a pas de correspondance, l'exception n'est pas levée.

Mon modèle 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; }
    }
}

Et mon schéma (tiré de la base de données SQL) - généré automatiquement à l'aide des migrations code-first:

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])
);

J'ai essayé de rendre PasswordIterations nullable, mais en vain.

10

Juste pour quelqu'un d'autre ayant des problèmes avec cela. Définissez un point d'arrêt dans DatabaseContext et assurez-vous qu'il se connecte à la base de données appropriée. Le mien était en train d'être écrasé à partir d'un fichier web.config que j'avais oublié.

7

On dirait que votre schéma et l'entité ne correspondent pas. Vous avez posté votre premier code généré par le code, mais cela a peut-être changé depuis la création de la table. Examinez le tableau dans le Gestionnaire SQL Server et vérifiez le type de données pour cette colonne.

9
Salizar Marxx

Je suis tombé sur ce message SO sur la façon de résoudre un problème similaire.

J'ai trouvé que ma procédure stockée avait une logique conditionnelle pouvant renvoyer une chaîne ou un entier pour la première colonne du jeu de résultats.

EF semblait prendre le premier bit de code de jeu de résultats trouvé, qui renvoyait une chaîne.

J'ai corrigé cela en faisant en sorte que le sproc retourne une chaîne dans un sens ou dans l'autre.

3
Bill Needels

Si c'est nul, pourquoi l'avez-vous marqué comme requis? Supprimer le drapeau requis et il devrait se comporter comme prévu.

2
Steve

dans ma vraie base de données, mon champ était nullement capable mais dans mon modèle en code, mon champ était simple. Je l'ai changé en int? (int nullable) et maintenant cela fonctionne très bien.

1
user3824087

J'ai eu un problème similaire avec une importation proc dans le modèle EF et il s'est avéré que l'instruction select avait changé. EF voyait le champ de résultat comme une chaîne plutôt que l'int qui était défini dans le modèle généré d'origine. Nous avons dû explicitement lancer le processus dans le proc à un int et tout était heureux à nouveau.

1
rjpipkin

Une possibilité d'une telle erreur, j'avais vu après avoir changé le type de données de string à int.

Avant le changement

public string foo { get; set; }

Après le changement

public int foo { get; set; }

Avant cette modification, string permettra d'insérer des valeurs null dans la table. Après modification, les anciens nuls peuvent devenir une raison de générer de telles erreurs.  

Remplacer les valeurs nulles dans la table par un nombre (par exemple: 0)

1
student

La question est résolue mais peut être utile à quelqu'un d'autre: 

assurez-vous que vous écrivez la connexion correcte à la base de données et que vous pouvez faire en sorte que le c # génère la chaîne de connexion pour vous en:
ajouter un nouvel élément -> Données -> Modèle de données d'entité ADO.Net -> Code premier à partir de la base de données ---> Nouvelle connexion ---> et spécifier vos paramètres et tester la connexion -> ok -> ok -> jusqu'à la fin 

ouvrez web.config et vous trouverez votre chaîne de connexion


vérifiez également s'il existe une colonne Nullable dans la base de données et implémentez-la dans votre classe comme suit: pour ex: public int? WorkedYears {get; ensemble; }
ref: EFCode First Property Null problem

0
Flowra

A eu le même problème avec View. Avec une conversion explicite en nvarchar de la colonne problématique dans le script de vue et une mise à jour du modèle, elle a été corrigée

0