0

EFを使用してCMSに基本的なCRUDがあり、最初にデータベースを使用して行われました。削除機能は、データベースからレコードを削除するだけです。

以下は、削除のコントローラー コードです。

 public ActionResult Delete(int id)
    {
        Database_Table database_table = db.Database_Table.Find(id);
        return View(database_table);
    }


    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {            
        Database_Table database_table = db.Database_Table.Find(id);
        db.Database_Table.Remove(database_table);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

クライアントの観点からの安全上の理由から、実際にデータベース テーブルからエントリを削除する代わりに、データベース内の値、つまり「削除済み」を「N」から「Y」に変更してから非表示にします。 'Y' の値を持つエントリは、カスタム クエリを介して表示されません。それが理にかなっていれば。私の質問は、このコードを削除しないように変更する方法ですが、その 1 つの値を変更するだけです。

私はそれが次のようになると思います:

[HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {
        if (ModelState.IsValid)
        {

        Database_Name database_name = db.Database_Name.Find(id);
        db.Entry(database_name).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
        }
            return View(database_table);
    }

しかし、変更される唯一の値、この例では「削除された」値をどこで定義しようとしているのかわかりません。また、値が「N」のエントリのみをビューに返す必要があると言うかもしれません

4

2 に答える 2

0

このコードを試してください。これらの種類のコードを別のレイヤーのメソッドに移動することをお勧めします (新しいクラスを作成して、このメソッドをそこに配置し、コントローラー アクション/任意の場所から呼び出すことができます。

Database_Name database_name = db.Database_Name.Find(id);

database_name.Deleted="Y";
db.Database_Name.Attach(database_name);
db.Entry(database_name).State = EntityState.Modified;
try
{        
   db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
    ex.Entries.Single().Reload();
    context.SaveChanges();        
}
catch (Exception ex2)
{
    //some error. Log it 
}
于 2012-08-30T15:11:01.277 に答える
0

これは、条件付きマッピングの使用例です。条件付きマッピングにより、すべてのクエリから削除済みアイテムが自動的にフィルター処理されます。

  • Linq クエリ
  • イーガーローディング
  • 遅延読み込み

積極的に読み込まれたデータと遅延読み込みされたデータから論理的に削除されたレコードをフィルター処理する他の信頼できる方法はありません。

しかし、条件付きマッピングには欠点もあります。

  • Deletedプロパティは、条件付きマッピングに既に使用されているため、エンティティの一部にすることはできません (このモデルで削除されたレコードをクエリすることはできません)。
  • 削除操作は、コード内のプロパティにアクセスできないため、ソフト削除を実行するストアド プロシージャ (または EDMX での手動変更が必要なカスタム SQL) にマップする必要があります。Deleted
  • これを完全に機能させるには、EDMX を使用する必要があります。これは、コードが最初にストアド プロシージャ マッピングをサポートしていないためです。
于 2012-08-30T20:55:00.853 に答える