2013-10-07 52 views
2

即時通訊工作與breezejs和我的應用程序的服務器端代碼是.net。breezejs問題與保存包

在我的意見(客戶端),我想添加和實體,然後我想保存它。讓我們假設一個實體是這樣的:

{ 
    "Id": 1, 
    "Name": "someName", 
    "CreatedDate": "1900-01-01T05:00:00Z", 
    "UpdatedDate": "1900-01-01T05:00:00Z", 
    "CreatedBy": null, 
    "UpdatedBy": null, 
    "RowVersion": 0, 
    etc ... 
    } 
} 

我想設置的CreatedDateUpdatedDateCreatedByUpdatedBy的價值觀,我能做到這一點當然是使用JavaScript的,但我不希望客戶把這些樣的護理東西的。

我的微風控制器在那裏住這個函數是這樣的:

[HttpPost] 
public SaveResult SaveChanges(JObject saveBundle) 
{ 
    return _contextProvider.SaveChanges(saveBundle); 
} 

如u可以看到saveBundle是JObject,當我調試,我看到saveBundle這樣的:

{ 
"entities": [ 
{ 
    "Id": 1, 
    "Name": "someName", 
    "CreatedDate": "1900-01-01T05:00:00Z", 
    "UpdatedDate": "1900-01-01T05:00:00Z", 
    "CreatedBy": null, 
    "UpdatedBy": null, 
    "RowVersion": 0, 
    etc ... 
    } 
    } 
} 
], 
"saveOptions": {} 
} 

如何在保存提交之前,我可以在saveBundle中更改CreatedDateUpdatedDateCreatedByUpdatedBy的值嗎?

這是一個JObject對象的數組作爲proprety,我可以操縱JavaScript的JSON,我怎麼能用.Net?

非常感謝。

回答

5

感謝Jay Traband發佈後,我終於找到了一種在保存之前對實體進行更改的方法。

我重載BeforeSaveEntity這樣的:

protected override bool BeforeSaveEntity(EntityInfo entityInfo) { 
     // Return false if don´t want to save the entity 
     var entityType = entityInfo.Entity.GetType(); 

     if (entityInfo.Entity.GetType() == typeof(MyEntityTypeModel)) 
     { 
      if (entityInfo.EntityState == EntityState.Added) 
      // It can be 'Modified' or 'Deleted' 
      { 
       var MyModel = entityInfo.Entity as MyEntityTypeModel; 

       MyModel.CreatedDate = DateTime.Now; 
       MyModel.UpdatedDate = DateTime.Now; 
       string username = Membership.GetUser().UserName; 
       MyModel.CreatedBy = username; 
       MyModel.UpdatedBy = username; 
      } 
     } 
     return true; 
    } 

非常感謝,我希望這會幫助別人一天。

+0

你應該把它標記爲答案吧? –

+0

我在同一個問題上跑來跑去,到處都看到答案是'BeforeSaveEntities'。我懷疑這會引入設計級別的問題,因爲我們被迫在DataContextProvider中執行所有業務級別的操作,理想情況下應該在存儲庫中完成這些操作。如果我們有10個以上的實體在保存之前修改,該怎麼辦?我們將使用swich-case來檢查實體類型並進行修改嗎?我們可以遵循的最佳做法是什麼? – devC

+0

請注意,您在修改實體時還需要更新OriginalValuesMap,例如entityInfo.OriginalValuesMap [「UpdatedDate」] = null; 更多信息在這裏 - > http://breeze.github.io/doc-net/contextprovider.html#OriginalValuesMap – JSancho

3

您可以通過使用ContextProvider的虛擬BeforeSaveEntityBeforeSaveEntities方法攔截微風的服務器端保存過程。文檔herehere有關於此主題的更多信息。

例如,您可以覆蓋BeforeSaveEntities,其代碼如下所示。

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) { 

    foreach (var type in saveMap.Keys) { 
    var list = saveMap[type]; 
     foreach (var entityInfo in list) { 
     var entity = entityInfo.Entity; 
     // .. do something interesting here 
     } 
} 
+0

是啊我同意,但我如何檢查'EntityInfo'對象? – dafriskymonkey

+0

我在前面的答案中添加了一個示例。 –

+0

謝謝,保存了我的夜晚 –