2013-03-28 23 views
1

我有一個Web API項目,由MSSQL數據庫支持,該數據庫包含(幾乎)每個表上的創建和修改字段。這些字段上有觸發器,分別在插入和更新記錄時更新。在序列化中使用JsonIgnore,但不在反序列化中使用;與部分模型混淆

現在,當我在成功請求後將數據序列化爲JSON數據時,我確實希望發送那些創建和修改的字段,以便發出請求的前端可以完成它們的工作。然而,我不想要的是,當數據被反序列化(或者,回發)時,這些字段可以被修改。很簡單,你會說,只需在字段上使用[JsonIgnore]屬性;把它只放在集合上,而不是放在集合上。

現在,這裏是開始讓我感到困惑的地方。我的項目中的所有模型都是從實體模型(.edmx)自動生成的。因此,我不能直接編輯模型本身的任何東西,但我必須在它們上面生成部分模型。我在其他SO線程中看到了使用[MetadataType]屬性的解決方案,就像這個here一樣。

但是,我如何將這個(有效)應用於我的情況?我一直在四處搜尋,但還沒有找到如何在「更高」的部分類中分解自動實現的屬性的例子。即使如此,這意味着我將不得不爲我的所有模型創建部分類,這將非常麻煩。我無法想象沒有人曾經這樣做過,所以不會有更優雅的方式來追求這一點嗎?

類的一個例子是:

public partial class Person 
{ 
    [DataMember] 
    public Nullable<System.DateTime> Created { get; set; } 
    [DataMember] 
    public Nullable<System.DateTime> Modified { get; set; } 
} 
+0

從您的實體模型創建Dto對象而不是直接使用Enity模型 – 2013-03-28 10:05:37

+0

我真的需要爲每個類生成DTO,以便將創建和修改的字段保留在集合操作之外嗎? 這會產生很多開銷,我猜... – Kazu 2013-06-24 13:12:00

回答

1

最後,我從一個模型First方法代碼優先的方式切換,使得我會在我的模型更多的控制。

雖然搜索了很多,但我來回答我自己的問題。這個問題的核心是我想能夠自動設置創建和修改字段,並忽略前端的反序列化,同時仍然能夠通過序列化將這些字段發送到前端。

解決方案在於覆蓋DbContext類中的SaveChanges方法。這個SO線程給出了一個很好的例子:Entity Framework 4.1 DbContext Override SaveChanges to Audit Property Change。所以,所有的禮節都要歸功於James Pogran在我腦海中激發了這個想法,並以這種方式解決了這個問題。

他所做的是檢查DbEntity更改方式。他根據是否添加或修改條目來設置「創建」和「修改」字段,並隨後調用base.SaveChanges以繼續正常操作。