1

私はカスタムHTMLヘルパーでデータベースを使用して、ビューでフォームを使用せずにajaxを使ってチェックボックスの状態を取得しています。 - > ID、状態(trueまたはfalse)、名前(チェックボックスの名前) ASP.NETとSQL Server:更新はしませんが、追加/挿入します

  • Tbl_2 - > ID、user_guid、タイムスタンプ、Tbl_1Id(FOREIGN_KEY)
    • Tbl_1:私は2つのテーブルを持っています

      私は挿入操作を行うときに問題なく動作しますが、GUIDも取得するため、ログインしたユーザーに基づいてテーブルが追加/挿入されます。

      マイコントローラ:

      public ActionResult SetState(checkboxstate cbstate) 
      { 
          var UserId = new Guid(System.Security.Claims.ClaimsPrincipal.Current.FindFirst("sub").Value); 
          var ent = new StartopDatabaseEntities(); 
      
          var cbs = ent.checkboxstates.Where(w => w.Name == "World").FirstOrDefault(); 
      
          if (cbs == null) // when there are no records in the database 
          { 
           ent.checkboxstates.Add(cbstate); 
           ent.checkboxstateUpdates.SingleOrDefault(c => c.Id == cbstate.Id); 
      
           var cbsOp = new checkboxstateUpdates(); 
           cbsOp.timestamp = DateTime.Now; 
           cbsOp.user_guid = UserId; 
           cbstate.checkboxstateUpdates.Add(cbsOp);    
           ent.SaveChanges();    
          } // record in database, update (I've only one user now, so has to update only this one) 
          else 
          { 
           var cbsOp = new checkboxstateUpdates(); // declare in global 
           var chc = new checkboxstate();   // to be declared in global 
           var newCbs = ent.checkboxstateUpdates.Include(c => c.checkboxstate).ToList(); 
      
           foreach (var u in newCbs) 
           { 
            if(u.user_guid==UserId && u.CheckboxStateId == u.checkboxstate.Id) 
            { 
             chc.state = cbstate.state; 
             chc.name = cbstate.name; 
             ent.checkboxstates.Add(chc); 
             cbsOp.Tidspunkt = DateTime.Now; 
             cbsOp.OpdateretAfBruger = UserId; 
             ent.checkboxstateUpdates.Add(cbsOp); 
             ent.SaveChanges(); 
            } 
           } 
          } 
      

      誰が、なぜそれが新しいID(主キー)と同じデータを挿入/更新が、追加ではないですしてください説明できますか?私は、Ajaxがチェックボックスの状態と名前を持つコントローラへの呼び出しを送信する簡単なビューを持っています。私も

      も私がもしブロックのロジックに明確ではないです..あなたが達成したいロジックのコードを書いていない任意の助け

    +0

    'else'ブロックは更新とされていますか?あなたは何も更新しておらず、新しいレコードを作成し、 '.Add()'を呼び出してそれらをデータに追加しています。 – David

    +0

    エラーはどうなりますか?それはデータベースの例外ですか?エラーを提供し、トレースをスタックして答えを出す必要があります。 – Dhanuka777

    +0

    はいDavid以外、更新用です。どうすればいいのか教えてください。 –

    答えて

    1

    なし

    Db.Entry(obj).state = EntityState.Modified 
    

    を試してみましたが、そうでない場合、以下のように部分を修正することができます。私はいくつかは、デビッドあたりのようなコードに変更しました

    u.checkboxstate.state=cbstate.state; 
    u.checkboxstate.name=cbstate.name; 
    u.timestamp=DateTime.Now; 
    ent.saveChanges(); 
    

    私はインスタンスを取得、つまり間違ったロジックを使用していた@デビッド& @Chetanからの助けを借りてこれを解決

    var newCbs = ent.checkboxstateUpdates.Include(c => c.checkboxstate).Where(u.user_guid == UserId).FirstOrDefault(); 
    
    if(newCbs != null) { 
        newCbs.checkboxstate.state = cbstate.state; 
        newCbs.checkboxstate.name = cbstate.name; 
        newCbs.Tidspunkt = DateTime.Now; 
        newCbs.OpdateretAfBruger = UserId; 
    
        ent.SaveChanges(); 
    } 
    
    +0

    ロジックが全体的ではなく、良いインスピレーションを得たので、部分的に正しい解決策。 –

    0

    'ent'オブジェクトではなくクラスの助けてくれてありがとう。

    関連する問題