比较对象列表和更新

时间:2014-05-21 15:33:28

标签: asp.net-mvc ravendb

我有一个视图,将Originals的LIST传递给此方法。 在帖子发生之前,我改变了一些属性。 我现在收到更新列表作为我的方法中的参数,并希望 使用这些新值更新数据库。

[HttpPost]
    public ActionResult NewValue(Page model)
    {

        var ListOfOriginals = Session.Query<Original>().ToList(); //GETS the objects i want to update

    listOfOriginals = Model.Pages // Model.page is the new list containing the updated values
    RavenSession.SaveChanges();
    return RedirectToAction("Index");
}

当我调试时,我可以看到listOfOriginals获取新值。 问题是我不知道如何使用这些新值更新RavenDB。 我尝试在Session.Store(listOfOriginals)之前添加此SaveChanges(),但这导致了错误。也许还有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您需要将每个Model.Pages值中的值复制到从db获得的匹配现有值。

答案 1 :(得分:0)

在更新之前,您需要检索所需的所有项目。

我发现你正在使用session.Query<Original>().ToList()。这就像SELECT * FROM Table,RavenDB可能无法撤回大数据集上的所有内容。它每次检索限制为1024,因为这是一个危险的操作。

相反,您可以通过ID请求批量撤回项目。例如:

[HttpPost]
public ActionResult NewValue(Page model)
{
   var ids = Model.Pages.Select(x=>x.Id);

   var listOfOriginals = RavenSession.Load<Original>(ids.ToArray());

   // Modify values as you need to, as the RavenSession is tracking changes for you.

   RavenSession.SaveChanges();
   return RedirectToAction("Index");
}

RavenDB将快速直接通过密钥检索项目。另请注意,由于IDocumentSession已在跟踪更改,因此您无需表明它们已被更改。

您需要使用IDocumentSession.Store的唯一原因是添加新项目。例如,要添加新的Page,请考虑以下代码:

// Adds a new page to RavenDB
[HttpPost]
public ActionResult AddPage(Page model)
{   
   // Queues a new record for storage, giving it an ID to work with.
   RavenSession.Store(model);    

   // Commits to the DB
   RavenSession.SaveChanges();

   return RedirectToAction("Index");
}

如果您使用过NHibernate,它的工作方式几乎相同。