2013-03-27 84 views
2

我的問題是:Breeze.js - 更改服務器上的實體的屬性值保存實體之前

是否有可能,在Breeze.js,改變/設置實體上的屬性值服務器保存此實體之前?

例如,假設有一個名爲產品的實體,這個實體有一個名爲價格,我想屬性,在服務器和存儲的實體之前,乘以一個常數價格值。

尋找herehere,我嘗試使用下面的方法:BeforeSaveEntity(entityInfo)BeforeSaveEntities(saveMap)SaveChangesCore(saveMap)

source code中,我瞭解BeforeSaveEntity(entityInfo)BeforeSaveEntities(saveMap)僅用於驗證實體。這不是我要找的。

在具有源代碼描述here方法SaveChangesCore(saveMap),我認爲在這裏是改變的實體的屬性值的位置。

所以我嘗試了以下,但它沒有奏效。值未更新數據庫提前

protected override List<KeyMapping> SaveChangesCore(Dictionary<Type, List<EntityInfo>> saveMap) 
     { 
      foreach (var entity in saveMap[typeof(Product)]) 
      { 
       var product = (Product)entity.Entity; 

       product.Price = product.Price * 10; // changing the value of the property  

      } 

      return base.SaveChangesCore(saveMap);  
     } 

感謝,

貝爾納多·帕切科

回答

3

您可以在您的DbContext類做到這一點。 您可以覆蓋SaveChanges方法和做類似:

public override int SaveChanges() { 
    foreach (var entry in this.ChangeTracker.Entries() 
      .Where(e => e.State ==EntityState.Added)){ 
     var entity=entry.Entity as Product; 
     if(entity!=null){ 
      entity.Price = entity.Price * 10; 
     } 
    } 
    return base.SaveChanges(); 
} 

我假設你正在使用實體框架。

我認爲這篇文章是關於你的問題也:

Breeze BeforeSaveEntityonly only allows update to Added entities

+0

你指給我解答我的問題的答案。謝謝。 – 2013-03-28 15:17:33

+0

嗨@Julian Yuste,你的想法非常好。但你想告訴我,我如何重寫SaveChanges()方法。我沒有找到SaveChanges()的任何重寫方法。請給我完整的例子。謝謝。 – Shohel 2014-08-03 05:49:59

2

我們有做的正是這一點,所以我不知道發生了什麼類似的測試,但我有一些建議。第一變化

foreach (var entity in saveMap[typeof(Product)]) { 
    ... 
} 

List<EntityInfo> entities; 
if (saveMap.TryGetValue(typeof(Product), out entities)) { 
    foreach (var entity in entities) { 
     ... 
    } 
} 

這樣做的原因是,saveMap是一個.NET詞典,使用索引時將引發KeyNotFoundException(saveMap [typeof運算(產品)]),如果鍵未找到。當saveMap不包含特定的entityType時,會有很多情況。

而且,這可能只是一個錯字,但是從你的覆蓋方法的返回類型應該是一個字典<類型,列表< EntityInfo >>而不是一個列表< EntityInfo>。

我也會進入你的代碼,並確保它正在執行你期望的方式。您的代碼可能會拋出異常,並在傳播到您的用戶界面之前就被吃掉了。

+0

謝謝你的建議,傑伊! – 2013-03-28 16:25:32

相關問題