从.Net API更新RavenDB文档

时间:2013-05-24 17:04:00

标签: .net ravendb

我正在尝试更新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父类中)

谢谢!

2 个答案:

答案 0 :(得分:2)

这不起作用的原因是因为它正在用Raven不知道的新对象替换整个文档(Raven自从Raven加载后跟踪它)。

不特定于Raven的通用解决方案是使用某种映射库,例如AutoMapperValueInjector,这两种映射库都可以在NuGet上使用。

使用ValueInjector,您只需替换

doc = value;     

doc.InjectFrom(value);

适当的使用:

using Omu.ValueInjecter;

这会将value中的所有属性映射到doc

答案 1 :(得分:1)

您可以随时逐出原始文档,并使用以下内容保存新文档:

RavenSession.Advanced.Evict(doc);
RavenSession.Store.Evict(value);