我有一个视图,将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()
,但这导致了错误。也许还有更好的方法可以做到这一点?
答案 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,它的工作方式几乎相同。