2016-12-15 5 views
0

Ich mache einen "Online ATM" für eine Zuordnung mit MVC.Net Framework und Entity Framework. Das Problem, das ich habe, ist wie folgt: Eine der Funktionen meines Systems ist es, Benutzern zu erlauben, eine Überweisung von einem Konto zu einem anderen zu machen. Im Folgenden finden Sie die Post-Methode für diese Aktion:System.ArgumentException beim Versuch, einen Datensatz zu finden

[HttpPost] 
    public ActionResult Transfer(decimal TransferAmount, string AccTransfer, string accId, int id) 
    { 

     using (var ctx = new BankDBEntities()) 
     { 


      AtmAccount acc = ctx.AtmAccounts.Find(id); 

      if (ctx.AtmAccounts.Any(o => o.AccountNumber.Equals(AccTransfer))) 
      { 

       AtmAccount trans = ctx.AtmAccounts.Find(AccTransfer); 

       if (acc.AccountBalance >= TransferAmount) 
       { 

        acc.AccountBalance = acc.AccountBalance - TransferAmount; 
        trans.AccountBalance = trans.AccountBalance - TransferAmount; 
        ctx.Entry(acc).State = System.Data.Entity.EntityState.Modified; 
        ctx.SaveChanges(); 
        ctx.Entry(trans).State = System.Data.Entity.EntityState.Modified; 
        ctx.SaveChanges(); 

        return RedirectToAction("Index"); 
       } 

       else 
       { 
        return RedirectToAction("Transfer"); 
       } 

      } 
      else 
      { 
       return RedirectToAction("Transfer"); 
      } 

     } 

Diese Methode führt den TransferAmount und AccTransfer (das Konto zu übertragen), sowie die Konto-ID und Benutzer-ID des Benutzers von der Überweisung, die ist wird vom zugehörigen View-Modell übergeben. Das Problem scheint in dieser Codezeile zu sein:

AtmAccount trans = ctx.AtmAccounts.Find(AccTransfer); 

An dieser Stelle ich eine System.ArgumentException Lesung bekommen „Die Art der einen der Primärschlüsselwerte haben den Typ in der Einheit definiert nicht überein See. innere Ausnahme für Details. " Ich kann nicht für das Leben von mir, herauszufinden, wie man dieses Problem umgehen kann.

UPDATE ZUM PROBLEM:

nach der Ausgabe über die Lösung, ich habe jetzt ein Problem, wo die trans Einheit, aus irgendeinem Grunde, nach dem Versuch, null ist AccTransfer in der Tabelle zu finden, die auf jeden Fall vorhanden.

+0

AccTransfer ist eine Zeichenfolge. Es muss ein int wie der vorherige Anruf sein. Versuchen Sie AtmAccount trans = ctx.AtmAccounts.Find (Int32.Parse (AccTransfer)); –

+0

Okay gut, das hat dieses Problem gelöst. Jetzt, aus welchem ​​Grund auch immer, scheint meine "trans" Entität null zu sein, obwohl AccTransfer definitiv in AtmAccounts vorhanden ist. –

Antwort

0

Es scheint, es ist das Problem der Typenkonflikt. Dies liegt möglicherweise daran, dass der Datentyp der Primärschlüsseleigenschaft dieser Klasse - AccTransfer nicht mit dem Datentyp des Primärschlüssels des tatsächlichen Entitätsobjekts übereinstimmt oder davon abweicht.

+0

Das scheint das Problem gewesen zu sein. AccTransfer sucht jedoch nach dem Kontonummernfeld und nicht nach dem Id-Feld der Tabelle. Das Problem, das ich jetzt habe, nachdem ich AccTransfer zu einem int anstatt zu einer Zeichenkette geändert habe, ist, dass trans scheinbar als null zurückkommt. Das Ändern der Kontonummer in der AtmAccounts-Tabelle zu einem int verursacht leider andere Probleme in der Steuerung. –

0

Der Datentyp einer Variablen in .net und der der entsprechenden Spalte in der Datenbank sollten übereinstimmen.

In Ihrem Fall -

AccTransfer is string 

Aber da es eine Kontonummer, ich denke, in der Datenbank Sie es als eine ganze Zahl wie die vorherige Aussage erwähnt haben muss -

AtmAccount acc = ctx.AtmAccounts.Find(id); 

Werke absolut fein.

0

Grund könnte sein, dass AccTransfer nicht primär ist oder AccTransfer ist null oder es kann nicht einen Datensatz entsprechend AccTransfer finden, oder Sie können verwenden ctx.AtmAccounts.SingleOrDefault (o => o.TransferAccount == AccTransfer)

+0

Ich habe dies überprüft, AccTansfer ist 125468 in meiner Prüfung, die die Kontonummer eines Datensatzes in der AtmAccounts-Tabelle ist. AccTransfer ist niemals null, aber Trans kann AccTransfer aus irgendeinem Grund nicht in der Tabelle finden. Muss die Kontonummer der primäre Schlüssel für mich sein, um dies zu können? –

+0

Ja Find() benötigt einen Primärschlüssel, oder Sie können ctx.AtMAccounts.SingleOrDefault verwenden (o => o.TransferAccount == AccTransfer) – Lekve

+0

Das war genau die Antwort, die ich brauchte, vielen Dank! –

Verwandte Themen