2

我正在尝试更新 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();
        }
    }

显然,我要做的最后一件事是必须单独遍历所有属性(特别是因为它的实际实现是在通用父类中)

谢谢!

4

2 回答 2

3

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

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

使用 ValueInjector,您只需替换

doc = value;     

doc.InjectFrom(value);

并适当使用:

using Omu.ValueInjecter;

这会将所有属性映射valuedoc

于 2013-05-24T20:38:57.027 回答
1

您始终可以驱逐原始文档,并使用以下命令保存新文档:

RavenSession.Advanced.Evict(doc);
RavenSession.Store.Evict(value);
于 2014-07-31T06:32:04.587 回答