在changeRequestInterceptor方法中保存新实体

时间:2014-08-25 14:57:39

标签: breeze

我只是想将实体上所有更改的一些审计细节保存到数据库中。因此我已经提出了" changeRequestInterceptor"这看起来像我可以在其中实现我的审计逻辑。

嗯,问题是,是否可以添加这个新创建的实体来请求有效负载?

 var adapter = breeze.config.getAdapterInstance('dataService');
        adapter.changeRequestInterceptor = function (saveContext, saveBundle) {
            this.getRequest = function (request, entity, index) {
                var em = saveContext.entityManager;                    

                var en = em.createEntity('DbLog',
                {
                    userId: //userId
                    logDate: new Date(),
                    log: //some log text
                });

                //How to add "en" entity to requet payload.

                return request;
            };
            this.done = function (requests) {
            };
        };

2 个答案:

答案 0 :(得分:1)

另一种方法是在服务器而不是客户端上执行添加。

[HttpPost]
public SaveResult SaveWithFoo(JObject saveBundle) {
  ContextProvider.BeforeSaveEntitiesDelegate = AddNewFoo;
  return ContextProvider.SaveChanges(saveBundle);
}


private Dictionary<Type, List<EntityInfo>> AddNewFoo(Dictionary<Type, List<EntityInfo>> saveMap) 
   var foo = new Foo();
   // update the entity with any custom data. For example:
   foo.OrderDate = DateTime.Today;

   var ei = ContextProvider.CreateEntityInfo(foo);
   List<EntityInfo> fooInfos;
   if (!saveMap.TryGetValue(typeof(Foo), out fooInfos)) {
     fooInfos = new List<EntityInfo>();
     saveMap.Add(typeof(Foo), fooInfos);
   }
   fooInfos.Add(ei);
   return saveMap;
}

答案 1 :(得分:1)

我坚决认为杰伊赞成在服务器上创建审计记录,而不是客户端。客户可以更少关心,不应承担创造额外材料的负担,也不必为这种东西燃烧带宽。这真的不是客户关注的问题。

面向Breeze的服务器组件中有一个保存拦截器。 Breeze客户端保存管道中没有保存拦截器。

我们的DevForce产品中有这样的东西。经过仔细考虑后,我们没有将它带到Breeze,我们相信我们明智地将其排除在外。拦截器增加了复杂性和模糊性。有时它们是必要的(与我们的服务器端拦截器一样)但我们认为它们对客户端保存操作没有帮助或必要......出于我要解释的原因。

Breeze从不单独调用EntityManager.saveChanges那样做。这意味着处于完美的位置,可以决定在Breeze做其事之前会发生什么。这包括在保存之前创建补充实体更改,如果这是您需要的。

在我们的示例中,我们将EntityManager封装在某种服务组件中(例如,“DataContext”或“DataService”)。应用层(例如,视图模型)无法直接与EntityManager对话;他们必须通过DataContext来执行持久性操作。

您的DataContext API应该公开一个“保存”方法(或多个方法),用适当的业务逻辑包装EntityManager.saveChanges调用。

遵循此模式,您将发现实施保存前和保存后行为的充足机会。

  

当然Breeze确实在较低级别的堆栈中提供了保存拦截。例如,DataServiceAdapter处理Breeze实体表示与HTTP设置和JSON对象方式所需的特定后端服务之间的转换细节。在编写DataContext时,您希望为您提取这些详细信息。

     

你可能需要一些拦截方式......你会找到必要的钩子。但现在我们谈论的是你可以在Breeze实体抽象下做些什么。即使在技术上可行,这也是添加/修改/删除实体的错误位置。