0

ユーザーがアイテムを検索して詳細をアイテムに追加できる検索ページがあります。私は、ユーザーが同じ詳細を複数のアイテムに適用できるように取り組んでいます。ユーザーは、同じ変更を適用するすべての項目をチェックして、Commentボタンをクリックします。これにより、チェックされたアイテムとクリックされた特定のアイテムのリストが送信List<int> idsされます(既に存在する場合はテンプレートとして使用します)int id

ここから、ユーザーはコメントを好きなように編集して保存します。HttpPost Editアクションはどのように見えますか?そのアイテムにコメントがまだ存在しない場合はデータベースにコメントを追加する必要があります。そうでない場合は、存在するものを上書きします。以下は私が思いついたものです(基本的な概要)。これで私が目にする問題は、変更を適用するすべてのアイテムについてデータベースをポークする必要があることです。これを行うには、より良い方法が必要です。

[HttpPost]
public ActionResult Edit(CommentVM model)
{
    if (ModelState.IsValid)
    {
        foreach(int i in model.ids)
        {
            Comment comment = _db.Comments.Find(i);
            if(comment == null){
                //Create and add
            {
            else{
                comment.Text = model.Text;
                _db.Entry(comment).State = EntityState.Modified;
            }
        }

        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}
4

2 に答える 2

0

私は一種の自家製の方法を使用することになりました。両方の場合(エントリの追加とエントリの編集)は別々に処理する必要があるため、そのように処理しました。

List<int> InDB = _db.Comments           
    .Where(r => model.ids.Contains(r.id))
    .Select(r => r.id)
    .ToList();

List<int> diff = model.ids.Except(InDB).ToList();
//Loop through items to ADD
foreach (int i in diff)
{
    Comment comment = new Comment { Text = model.Text, id = i };
    _db.Comments.Add(comment);
}
//Loop through items to edit
foreach (int i in InDB)
{
    Comment comment = new Comment { Text = model.Text, id = i };
    _db.Entry(comment).State = EntityState.Modified;
}
于 2013-02-01T20:34:36.480 に答える
0

これに伴う問題は、変更を適用するすべてのアイテムに対してデータベースを突っ込む必要があることです。

これについて心配する必要はありません。変更を保存すると、データベースが一度呼び出されます。ループは、メモリ内のオブジェクトのみに影響します。あなたのコードに関しては、あなたは正しい方向に進んでいるように見えますが、1 つの潜在的な提案があります。コメントを変更または作成するためのさまざまな手順を考えると、ID によってアイテムにリンクされた個別のエンティティとしてコメントを作成および保存したと思います。このような場合は、「コメント」をアイテムのプロパティにすることをお勧めします。そうすれば、プロパティに書き込むだけでプロセス全体が簡素化されます。

于 2013-01-30T19:55:17.780 に答える