我正在尝试更新Raven数据库中的Person文档,但在分配新对象时丢失了对它的引用。我只能获得属性级别的工作。
public void Put(int id, [FromBody]Person value)
{
var doc = RavenSession.Load<Person>(Qualify(id));
if (doc == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
else
{
doc.FirstName = value.FirstName; //<-- doing it this way works
doc = value; //<-- doing it this way doesn't
RavenSession.SaveChanges();
}
}
显然,我要做的最后一件事就是必须单独遍历所有属性(特别是因为它的实际实现是在Generic父类中)
谢谢!
答案 0 :(得分:2)
这不起作用的原因是因为它正在用Raven不知道的新对象替换整个文档(Raven自从Raven加载后跟踪它)。
不特定于Raven的通用解决方案是使用某种映射库,例如AutoMapper或ValueInjector,这两种映射库都可以在NuGet上使用。
使用ValueInjector,您只需替换
doc = value;
带
doc.InjectFrom(value);
适当的使用:
using Omu.ValueInjecter;
这会将value
中的所有属性映射到doc
答案 1 :(得分:1)
您可以随时逐出原始文档,并使用以下内容保存新文档:
RavenSession.Advanced.Evict(doc);
RavenSession.Store.Evict(value);