2012-12-27 17 views
2

也許我不會以正確的方式進行討論,所以如果任何人都可以引導我走向正確的方向,我將不勝感激。c#庫或幫助對象映射/複製在RavenDB更新操作?

我有很多在我的代碼,這樣做

void UpdateWidget(Widget updatedWidget) 
{ 
    IDocumentSession session = documentStore.OpenSession(); 
    oldWidget = session.Load<Widget>("widgets" + widget.Id); 

    oldWidget.Name = updatedWidget.Name; 
    oldWidget.Color = updatedWidget.Color; 
    oldWidget.CreatedDateTime = updatedWidget.CreatedDateTime; 
    session.SaveChanges(); 
} 

我想要做的方法是類似如下(假設ID相同的課程)

void UpdateWidget(Widget updatedWidget) 
{ 
    IDocumentSession session = documentStore.OpenSession(); 
    oldWidget = session.Load<Widget>("widgets" + widget.Id); 
    oldWidget = updatedWidget 
    session.SaveChanges(); 
} 

有人可以幫助我做一些語法或圖案,可以讓我接近這個?有沒有一種方法可以在Raven中使用對象跟蹤來實現這一點?或者我需要某種形式的映射工具,像automapper提前(我不很瞭解)

的感謝!

回答

4

您可以只存儲更新的對象,它會取代舊的,如果它已經存在。

void UpdateWidget(Widget updatedWidget) 
{ 
    using (var session = documentStore.OpenSession()) 
    { 
     session.Store(updatedWidget); 
     session.SaveChanges(); 
    } 
} 

但是,您必須考慮併發效應。

如果你樂觀併發禁用,它應該接受新的文件,但風險踩着別人的變化。如果啓用它,則需要在同一個會話中執行加載和更新,或者您需要自己跟蹤文檔的etag。

審查細節如下RavenDB知識庫文章:http://ravendb.net/kb/16/using-optimistic-concurrency-in-real-world-scenarios

而且 - 不相關的問題,但它是非常重要的,你會被妥善處理。將其包裝在using聲明中。 (或者,如果它被注入,然後確保你的IoC有適當的壽命範圍,在適當的時候被處置它。)

1

AutoMapper或類似(Value Injecter)是理想的擺脫代碼映射的從一個對象到另一個。

使用AutoMapper,你將與

AutoMapper.Mapper.CreateMap<Widget, Widget>(); 
var oldWidget = AutoMapper.Mapper.Map<Widget, Widget>(updatedWidget); 

AutoMapper(.CreateMap)取代

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

應在應用程序啓動時進行配置。

+1

Automapper和價值噴油器是不錯的工具,但烏鴉可以處理這沒有任何映射代碼在所有。 –