2

我的问题是:

在 Breeze.js 中,是否可以在保存该实体之前更改/设置服务器上实体的属性值?

例如,假设有一个名为Product的实体并且该实体有一个名为Price的属性,我希望在服务器中并在保存实体之前,将Price值乘以一个常数。

看看这里这里,我尝试使用以下方法:BeforeSaveEntity(entityInfo), BeforeSaveEntities(saveMap), SaveChangesCore(saveMap)

源代码中,我理解BeforeSaveEntity(entityInfo)BeforeSaveEntities(saveMap)仅用于验证实体。这不是我要找的。

此处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);    
        }

提前致谢,

贝尔纳多·帕切科

4

2 回答 2

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 只允许更新添加的实体

于 2013-03-27T15:37:24.067 回答
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 字典,如果找不到键,则在使用索引器 ( saveMap[typeof(Product)]) 时将抛出 KeyNotFoundException。并且在很多情况下,saveMap 不包含特定的 entityType。

此外,这可能只是一个错字,但您覆盖的方法的返回类型应该是 Dictionary< Type, List< EntityInfo>> 而不是 List< EntityInfo>。

我还将进入您的代码并确保它以您期望的方式执行。您的代码可能会抛出异常,并且在传播到您的 UI 之前就被吃掉了。

于 2013-03-27T19:10:52.000 回答