2014-09-30 44 views
0

我正在試驗RavenDB。我們有裝飾有屬性按照以下(簡單)例如實體對象的顯著數:覆蓋Json序列化RavenDB

[Entity(UniqueID = "37AA8322-597D-48E8-BB66-7B2796103D95")] 
public class SampleEntity : Entity 
{ 
    protected SampleEntity() 
    { 

    } 

    public static SampleEntity Create() 
    { 
     return EntityFactory.Create<SampleEntity>(); 
    } 

    [Property] 
    public virtual int Integer { get; set; } 
} 

通過EntityFactory發射的類型實際上是一個亞類SampleEntity的將覆蓋設置器/吸氣劑自動執行INotifyPropertyChanged並跟蹤每個屬性的最後修改時間(等等)。

使用Json.NET我扔在一起的JSON序列化的實體,其爲SampleEntity與「整數」設置爲8的情況下會吐出類似下面的東西:

{ 
    "TypeID": "\"37aa8322-597d-48e8-bb66-7b2796103d95\"", 
    "UniqueID": "\"e1f03e21-260f-4bde-8bfb-ec7a47b2e379\"", 
    "Integer": { 
    "Last Set": "2014-09-30T14:06:08.9146417Z", 
    "Value": "8" 
    } 
} 

注意如何「整數'屬性得到擴展,包括'價值'和'最後一套'。如果我要求RavenDB存儲一個SampleEntity,我(如預期的)不會將'Last Set'與'Value'內聯(在基類中有一個字典映射屬性名稱到屬性信息,一個字段是物業最後一次設置)。

理想情況下,我想存儲我在RavenDB中編寫的Json-Entity序列化程序的輸出(以及爲每個實體自動生成的UniqueID作爲文檔ID)。當我檢索一個文檔時,它將是原始的json,我將負責使用它來保存合適的實體對象。我已經廣泛搜索,並找不到一個簡單的方法來實現這一點,歷史上這意味着我試圖做一些愚蠢的事情。

我對RavenDB(一般的文檔數據庫)和Json都是新手,所以也許我試圖在這裏把一個方形的釘子塞進一個圓孔,並且有一種更加優雅的方式來處理這種情況。

有沒有人知道在RavenDB中存儲原始json的方法?或者在另一種方式上有任何意見/建議可以完成我所描述的內容?

回答

1

一種選擇是使用轉換器來自定義寫入數據庫的RavenJObject,並自定義所需返回對象的填充方式。

繼承人一些代碼:

public class SampleEntityConverter : IDocumentConversionListener 
{ 
    public void EntityToDocument(string key, object entity, RavenJObject document, RavenJObject metadata) 
    { 
     var obj = entity as SampleEntity; 
     if (obj == null) 
     { 
      return; 
     } 

     var integer = new RavenJObject(); 
     integer["Last Set"] = obj.HoweverYouGetTheLastSetDateTime; 
     integer["Value"] = obj.Integer; 
     document["Integer"] = integer; 
    } 

    public void DocumentToEntity(string key, object entity, RavenJObject document, RavenJObject metadata) 
    { 
     var obj = entity as SampleEntity; 
     if (obj == null) 
     { 
      return; 
     } 

     var integer = document["Integer"] as RavenJObject;  
     if (integer != null && integer.ContainsKey("Value")) 
     { 
      obj.Integer = integer["Value"]; 
     } 
    } 
} 

然後在您的DocumentStore實例註冊它:

documentStore.RegisterListener(new SampleEntityConverter()); 
1

你可以註冊使用JSON.Net的內在副本RavenDB使用相同的轉換器。 在公約中,查看CustomizeSerialize方法