2016-12-15 72 views
0

我正在爲使用MVC.Net框架和實體框架的作業製作「在線ATM」。我遇到的問題如下:我的系統的功能之一是允許用戶從一個帳戶轉移到另一個帳戶。下面是Post方法進行此操作:System.ArgumentException嘗試查找記錄時

[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"); 
      } 

     } 

該方法以TransferAmount和AccTransfer(帳戶轉移到),以及從,這是使轉印的用戶的帳戶ID和用戶ID由關聯的視圖模型傳遞。這個問題似乎是在這行代碼:

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

在這一點上,我得到一個System.ArgumentException讀「之類的主鍵值不匹配的實體定義的類型之一見。內部例外的細節。「我不能爲了我的生活,找出如何解決這個問題。

更新的問題:

解決上述問題後,我現在有一個問題,即反式實體,出於某種原因,是試圖找到AccTransfer在餐桌上,這肯定存在後空。

+0

AccTransfer是一個字符串。它需要像以前的調用一樣。嘗試AtmAccount trans = ctx.AtmAccounts.Find(Int32.Parse(AccTransfer)); –

+0

好吧,那解決了那個問題。現在,無論出於何種原因,儘管AccTransfer肯定存在於AtmAccounts中,但我的「trans」實體似乎爲空。 –

回答

0

看來,這是類型不匹配的問題。這可能是因爲此類AccTransfer的主鍵屬性的數據類型與實際實體對象的主鍵的數據類型不匹配或不同。

+0

這似乎是問題所在。但是,AccTransfer正在查找賬號字段,而不是表中的Id字段。現在的問題是,在將AccTransfer改爲int而不是字符串之後,trans似乎返回爲null。將AtmAccounts表中的帳號更改爲int,不幸的是會導致控制器中出現其他問題。 –

0

.net中變量的數據類型和數據庫中相應列的數據類型應匹配。

在你的情況 -

AccTransfer is string 

但因爲它是一個賬號,我覺得你必須提到它作爲一個整數作爲前面的語句的數據庫 -

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

作品絕對精細。

0

原因可能是AccTransfer不是主要或AccTransfer爲空或它不能找到一個記錄對應AccTransfer,或者您可以使用ctx.AtmAccounts.SingleOrDefault(O => o.TransferAccount == AccTransfer)

+0

我檢查過了,AccTransfer在我的測試中是125468,這是AtmAccounts表中記錄的帳號。 AccTransfer從不爲空,但由於某些原因,trans在表中找不到AccTransfer。賬號是否需要成爲我能夠做到這一點的主要關鍵? –

+0

是Find()需要一個主鍵,或者你可以使用ctx.AtmAccounts.SingleOrDefault(o => o.TransferAccount == AccTransfer) – Lekve

+0

這正是我需要的答案,非常感謝你! –