Laden...

[gelöst]EFCore: Die angegebene Umwandlung ist ungültg

Erstellt von schuppsl vor 3 Jahren Letzter Beitrag vor 3 Jahren 431 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 3 Jahren
[gelöst]EFCore: Die angegebene Umwandlung ist ungültg

verwendetes Datenbanksystem: MSSQL

Verzweifelt suche ich meinen Fehler.
In einer Webanwendung wird per jQuery-$.Ajax eine Funktion im Webservice aufgerufen.

In dieser wird eine kleine Datenbankabfrage per EF Core getätigt.
Die identische Abfrage habe ich in anderen Funktionen, welches absolut kein Problem darstellt und alles funktioniert wunderbar.
Nur in dieser nicht.
Die Javascript Funktion wird per Button auf der Weboberfläche aufgerufen, wie alle anderen auch:


 var request =
    {
        "method": "POST",
        "url": urlReset,
        "data": {authorisation: "xy" }
    }
    $.ajax(request)
        .done(function (ergebnis) {
            alert("success");
        });

Die Funktion im Backend wird aufgerufen:


[HttpPost]
        public ActionResult ResetWagen(string authorisation)
        {
.......


Dann wird per Using die Abfrage gemacht:


using (var content = new MyContext())
            {
                
                var resData = content.PulverDataMan.AsQueryable().Where(x => x.IWagenNr == "99");

                if (resData.Any())//Datensatz vorhanden?
                {


Per Haltepunkt auf .Any(), Erweiterung auf Ergebinsansicht
steht im Feld "Message" die Meldung: > Fehlermeldung:

Die angegebene Umwandlung ist ungültg

Jetzt stellt sich mir die Frage: Welche Umwandlung?

IWagenNr ist vom Typ String, siehe DbContext


 [Column("WagenNr")]      
        public string IWagenNr { get; set; }


Also sollte

 x.IWagenNr == "99"

keiner Umwandlung bedürfen.

InnerException gibt es nicht, im Stacktrace steht:


   bei Microsoft.Data.SqlClient.SqlBuffer.get_Byte() in H:\tsaagent2\_work\11\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlBuffer.cs:Zeile 168.
   bei Microsoft.Data.SqlClient.SqlDataReader.GetByte(Int32 i) in H:\tsaagent2\_work\11\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlDataReader.cs:Zeile 1794.
   bei lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
   bei Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
   bei System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

In Expression.DebugView steht:


.Call System.Linq.Queryable.Where(
    .Constant<Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Pulverlackierung.Models.ColModel]>(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Pulverlackierung.Models.ColModel]),
    '(.Lambda #Lambda1<System.Func`2[Pulverlackierung.Models.ColModel,System.Boolean]>))

.Lambda #Lambda1<System.Func`2[Pulverlackierung.Models.ColModel,System.Boolean]>(Pulverlackierung.Models.ColModel $x) {
    $x.IWagenNr == "99"
}
}

Wie bereits erwähnt ist die exakte Abfrage in anderen Funktionen ebenso vorhanden, ohne Probleme.

Was habe ich übersehen?
Ganz herzlichen Dank im Voraus.

16.830 Beiträge seit 2008
vor 3 Jahren

Kommt meistens davon, dass die Spalten in der DB andere Typen haben als Deine Eigenschaft in Deinem Modell.
Ist ja gut, dass die WagenNr ein string ist in Deinem Modell und Du mit == "99" das in Deinem Code behandelst; aber schlecht wenn die WagenNr in der DB gar kein String ist. Aber das sehen wir hier nicht.

Irritiert mich auch, dass in der Exception von einem Bool gesprochen wird, was ja sicherlich kein string ist.

PS: es sind Methoden, keine Funktionen.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 3 Jahren

Der Datentyp in der Datenbank ist nvarchar(3).

2.079 Beiträge seit 2012
vor 3 Jahren

Möglicherweise verursacht ein anderes Feld diesen Fehler?
Immerhin rufst Du alle Spalten in der Datenbank ab, also muss er auch dafür sorgen, dass alle Datentypen passen.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 3 Jahren

Hm, wirklich seltsam das ganze.
Der DbContext wurde per Migration, also Datebase First generiert.
Von daher sollten die Datentypen passen.

16.830 Beiträge seit 2008
vor 3 Jahren

Nein, müssen sie nicht.
Migrations ist nicht unbedingt das stabilste Feature von EFCore (wars auch nie). Auch fehlen Migrations immer noch sehr viele Features, die aber zB DACPACs haben.
Daher verwenden die meisten Leute, die mit EF arbeiten, auch kein Migrations (mir eingeschlossen).

Fehlermeldung:
bei Microsoft.Data.SqlClient.SqlDataReader.GetByte(Int32 i) irgendwo is nen Byte im Spiel, das Probleme macht.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 3 Jahren

Natürlich hattest Du recht.

Es war in einem Datenbankfeld, welches als smallint, NULL definiert ist.
Aus irgendeinem Grund ist es in meinem Model byte, korrekt ist aber** short?**.

Da das Feld einfach so herumdümpelt und ich noch nie gebraucht habe, ist mir das bisher noch nie aufgefallen.

Herzlichen Dank an alle für die Mühe und Zeit.