2017-01-06 7 views
0

エンティティフレームワークからレコードを更新しようとすると、レコードがテーブルから削除されています。スローされたエラーはないので、実際に何が起こっているのか私は困惑しています。エンティティフレームワークMVCからレコードを更新しようとすると、データベースからレコードが削除されるのはなぜですか?

私はエンティティフレームワークとasp.netのかなり新しいです。私は今、約1ヶ月間それを学んできました。

私は、SQL Serverから問題なくレコードを更新しなく対からここでDBを更新するためのコードであることができます:私はcrs_monthlyデバッガを実行すると

// GET: /Scorecard/Edit/5 
    public ActionResult Edit(int id, string EmployeeName) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 


     CRS_Monthly crs_monthly = GetAgentById(id); 

     crs_monthly.EmployeeName = EmployeeName; 

     if (crs_monthly == null) 
     { 
      return HttpNotFound(); 
     } 

     return View(crs_monthly); 
    } 

    // POST: /Scorecard/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include="REC_ID,Cur_Plan,Plan_Update,Comments,Areas_Improve,Strengths,UPDATED_BY,UPDATED_TIME,Agent_Recognition")] CRS_Monthly crs_monthly) 
    { 
     if (ModelState.IsValid) 
     { 
      crs_monthly.UPDATED_TIME = DateTime.Now; 
      crs_monthly.UPDATED_BY = Request.LogonUserIdentity.Name.Split('\\')[1]; 
      db.Entry(crs_monthly).State = EntityState.Modified; 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     return View(crs_monthly); 
    } 

は有効であり、デシベルまで正常に見えます。変更内容を保存()。どんな助けでも大歓迎です!

+0

たとえば、 'SELECT COUNT(*)'を前後に実行すると、テーブルに1つ少ないレコードしかありませんか?おそらく、予期しない何かに更新されているのではなく、削除されている可能性があります。 –

答えて

0

あなたべき決してあなたはPOSTデータからバインドするプロパティを制限するためにBindを利用している場合は特に、ポストから作成したエンティティのインスタンスを保存します。代わりに、常にエンティティをデータベースから取り出し、投稿された値をそのデータベースにマップします。これにより、データが失われないことが保証されます。

Bindを使用すると、とにかく恐ろしい習慣です。主な問題は、すべてのプロパティが文字列値としてリストされており、メンテナンスに関する懸念が導入されていることです。これらのプロパティのいずれかを削除するか名前を変更すると、Bindのリストは自動的に更新されません。すべての単一インスタンスを変更することを忘れないでください。悪いことに、プロパティを追加する場合は、戻ってこのリストに含めることを忘れないようにしてください。そうしないと、データは通知なしで静かに破棄されます。

エンティティの一部のプロパティでのみ作業する必要がある場合は、それらのプロパティだけを含むビューモデルを作成します。次に、ビューモデルからの投稿値を、データベースから新しく取り出したエンティティのインスタンスにマップします。

+0

ありがとうございました。私は自分自身を教えているので、エンティティフレームワークのすべてのベストプラクティスを認識していません。私はあなたのアドバイスに従って、すべてが正しく更新されています。それは有り難いです! – cole570

関連する問題