2016-12-15 24 views
0

MVC.Net FrameworkとEntity Frameworkを使用して割り当て用に「オンラインATM」を作成しています。私の問題は次のとおりです。私のシステムの機能の1つは、ユーザーがあるアカウントから別のアカウントに移動できるようにすることです。以下は、このアクションの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は、からの転送を行う、されています関連するView Modelを渡します。問題は、このコード行にあるように表示されます。

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

この時点で、私は、主キーの値のいずれかのタイプは、エンティティで定義された型と一致しませんでした」System.ArgumentExceptionの読み取りを得るを参照してください。詳細については内部例外を参照してください。私は私の人生のために、この問題を回避する方法を理解することはできません。問題の

UPDATE:

上記の問題を解決した後、私は今、トランスエンティティは、何らかの理由で、間違いなく存在する、テーブルにAccTransferを見つけようとした後にnullの問題を抱えています。

+0

AccTransferを使用することができます文字列です。あなたの前の呼び出しのようなintである必要があります。 AtmAccountを試してみてください。trans = ctx.AtmAccounts.Find(Int32.Parse(AccTransfer)); –

+0

大丈夫、それはその問題を解決しました。今、何らかの理由で、私の "trans"エンティティは、AccTransferがAtmAccountsに確実に存在していても、nullのようです。 –

答えて

0

タイプミスマッチの問題ですね。このクラスAccTransferのプライマリキープロパティのデータ型が、実際のエンティティオブジェクトのプライマリキーのデータ型と一致していないか、または異なっている可能性があります。

+0

これは問題だったようです。ただし、AccTransferはテーブルのIdフィールドではなく、Account Numberフィールドを探しています。 AccTransferを文字列ではなくintに変更した後の問題は、トランスがヌルとして戻ってくるようです。 AtmAccountsテーブルのアカウント番号をintに変更すると、残念ながらコントローラに他の問題が発生します。 –

0

.netの変数のデータ型と、データベースの対応する列のデータ型が一致する必要があります。絶対に動作します

AtmAccount acc = ctx.AtmAccounts.Find(id); 
- あなたの場合

-

AccTransfer is string 

しかし、それは口座番号であることから、私はあなたが前の文のように整数としてそれを言及している必要があり、データベースに考えます良い。

0

理由AccTransferが主ではないことかもしれませんかAccTransferがnullであるか、それはAccTransferに対応するレコードを見つける傾ける、またはあなたがctx.AtmAccounts.SingleOrDefault(0 => o.TransferAccount == AccTransfer)

+0

これをチェックしましたが、AccTransferは私のテストでは125468です。これはAtmAccountsテーブルのレコードのアカウント番号です。 AccTransferは決してnullではありませんが、何らかの理由でtransがテーブル内でAccTransferを見つけることができません。これを行うには、アカウント番号が私の主なキーである必要がありますか? –

+0

ありFind()にはプライマリキーが必要ですが、ctx.AtmAccounts.SingleOrDefault(o => o.TransferAccount == AccTransfer)を使用することができます – Lekve

+0

これは私が必要としていた答えでした。 –

関連する問題