2013-03-27 53 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

相关问题