wake-up-neo.com

Versuch, eine Nicht-NULL-Zeichenfolge auf den Typ 'System.Int32' festzulegen

Entity Framework löst diese Ausnahme aus:

Die 'PasswordIterations'-Eigenschaft in' BranchIdentity 'konnte nicht auf einen' System.String'-Wert gesetzt werden. Sie müssen diese Eigenschaft auf einen Nicht-NULL-Wert vom Typ 'System.Int32' setzen.

Es wirft auf dieser Linie:

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

Die Ausnahme wird nur ausgelöst, wenn eine Entität vorhanden ist, die der Abfrage entspricht. Wenn keine Übereinstimmungen vorhanden sind, wird die Ausnahme nicht ausgelöst.

Mein BranchIdentity-Modell:

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; }
    }
}

Und mein Schema (aus der SQL-Datenbank übernommen) - automatisch mit Code-First-Migrationen generiert:

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

Ich habe versucht, PasswordIterations auf Null zu setzen, aber ohne Erfolg.

10

Nur für alle anderen, die Probleme damit haben. Legen Sie einen Haltepunkt in DatabaseContext fest und stellen Sie sicher, dass eine Verbindung zur richtigen Datenbank hergestellt wird. Meine wurde von einer web.config-Datei überschrieben, die ich vergessen habe.

Klingt so, als ob Ihr Schema und die Entität nicht übereinstimmen. Sie haben Ihren Code zuerst mit dem generierten Code gepostet, der sich jedoch seit der Erstellung der Tabelle geändert hat. Schauen Sie sich die Tabelle in SQL Server Manager an und überprüfen Sie den Datentyp für diese Spalte.

9
Salizar Marxx

Ich bin auf diesen SO Beitrag gestoßen, um ein ähnliches Problem zu lösen.

Ich fand heraus, dass meine gespeicherte Prozedur eine bedingte Logik hatte, die entweder einen String oder ein int für die erste Spalte in der Ergebnismenge zurückgeben konnte.

EF schien das erste Bit des gefundenen Ergebnissatz-Codes aufzugreifen, der eine Zeichenfolge zurückgab.

Ich habe das behoben, indem der Sproc so oder so eine Zeichenkette zurückgegeben hat.

3
Bill Needels

Wenn es nullwertfähig ist, warum haben Sie es als erforderlich markiert? Entfernen Sie das erforderliche Flag und es sollte sich wie erwartet verhalten.

2
Steve

in meiner echten Datenbank war mein Feld nullfähig, aber in meinem Modell im Code war mein Feld einfach int. Ich habe es in int geändert? (nullable int) und jetzt funktioniert es gut.

1
user3824087

Ich hatte ein ähnliches Problem mit einem proc-Import in das EF-Modell, und es stellte sich heraus, dass sich die select-Anweisung geändert hatte. EF sah das Ergebnisfeld als String und nicht als int, das im ursprünglich erzeugten Modell definiert wurde. Wir mussten das Feld in der Prozedur explizit zu einem int gießen und alles war wieder glücklich.

1
rjpipkin

Eine Möglichkeit eines solchen Fehlers hatte ich nach dem Ändern des Datentyps von string in int gesehen.

Vor dem Wechsel

public string foo { get; set; }

Nach der veränderung

public int foo { get; set; }

Vor dieser Änderung ermöglicht string das Einfügen von null-Werten in die Tabelle. Nach der Änderung können diese alten null-Werte zu Fehlern führen. 

Ersetzen Sie Nullwerte in der Tabelle durch eine Nummer (zB: 0)

1
student

Die Frage ist gelöst, kann aber für andere Personen nützlich sein: 

stellen Sie sicher, dass Sie die richtige Verbindung zur Datenbank schreiben, und Sie können mit c # die Verbindungszeichenfolge für Sie generieren:
Fügen Sie ein neues Element hinzu -> Daten -> ADO.Net-Entitätsdatenmodell -> Code zuerst aus der Datenbank ---> Neue Verbindung ---> und geben Sie Ihre Parameter und die Testverbindung an -> ok -> ok -> bis zum Ende 

Öffnen Sie die web.config und Sie finden Ihre Verbindungszeichenfolge


Überprüfen Sie auch, ob es in der Datenbank eine nullfähige Spalte gibt, und implementieren Sie sie in Ihrer Klasse wie folgt: für ex: public int? WorkedYears {erhalten; einstellen; }
ref: EFCode First-Eigenschaft Null-Problem

0
Flowra

Hatte dasselbe Problem mit View. Mit einer expliziten Umwandlung der problematischen Spalte in nvarchar im View-Skript und einer Aktualisierung des Modells wurde dieses Problem behoben

0