Mapping RavenDB中更新操作中对象映射/复制的c#库或助手?

Mapping RavenDB中更新操作中对象映射/复制的c#库或助手?,mapping,ravendb,Mapping,Ravendb,也许我没有走正确的路,所以如果有人能把我引向正确的方向,我将不胜感激 我的代码中有很多方法,它们可以 void UpdateWidget(小部件UpdateWidget) { IDocumentSession会话=documentStore.OpenSession(); oldWidget=session.Load(“widgets”+widget.Id); oldWidget.Name=updatedWidget.Name; oldWidget.Color=updatedWidget.Colo

也许我没有走正确的路,所以如果有人能把我引向正确的方向,我将不胜感激

我的代码中有很多方法,它们可以

void UpdateWidget(小部件UpdateWidget)
{
IDocumentSession会话=documentStore.OpenSession();
oldWidget=session.Load(“widgets”+widget.Id);
oldWidget.Name=updatedWidget.Name;
oldWidget.Color=updatedWidget.Color;
oldWidget.CreatedDateTime=updatedWidget.CreatedDateTime;
session.SaveChanges();
}
我想做的事情如下所示(当然假设ID相同)

void UpdateWidget(小部件UpdateWidget)
{
IDocumentSession会话=documentStore.OpenSession();
oldWidget=session.Load(“widgets”+widget.Id);
oldWidget=updatedWidget
session.SaveChanges();
}
有人能帮我一些语法或模式,可以让我接近这一点吗?有没有办法在Raven中使用对象跟踪来实现这一点?或者我需要像automapper这样的映射工具(我不太了解)

提前谢谢

AutoMapper或类似的()是摆脱从一个对象到另一个对象的代码映射的理想选择

使用AutoMapper,您将替换

oldWidget.Name = updatedWidget.Name;
oldWidget.Color = updatedWidget.Color;
oldWidget.CreatedDateTime = updatedWidget.CreatedDateTime;

AutoMapper.Mapper.CreateMap();
var oldWidget=AutoMapper.Mapper.Map(updatedWidget);

自动映射(.CreateMap)应该在应用程序启动时配置。

您可以只存储更新的对象,如果旧对象已经存在,它将替换它

void UpdateWidget(小部件UpdateWidget)
{
使用(var session=documentStore.OpenSession())
{
session.Store(updatedWidget);
session.SaveChanges();
}
}

但是,您必须考虑并发效应。

如果您禁用了乐观并发,它应该只接受新文档,但您可能会踩到其他更改。如果启用了它,则需要在同一会话中进行加载和更新,或者需要自己跟踪文档的etag

有关详细信息,请查看以下RavenDB知识库文章:


另外-与您的问题无关,但正确处理您的会话非常重要。使用语句将其包装在
中。(或者,如果正在注入,请确保您的IoC具有适当的生存期范围,并在适当的时候进行处理。)

Automapper和Value Injector是不错的工具,但Raven完全可以在不使用任何映射代码的情况下处理此问题。
AutoMapper.Mapper.CreateMap<Widget, Widget>();
var oldWidget = AutoMapper.Mapper.Map<Widget, Widget>(updatedWidget);