我只是想将实体上所有更改的一些审计细节保存到数据库中。因此我已经提出了" 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) {
};
};
答案 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实体抽象下做些什么。即使在技术上可行,这也是添加/修改/删除实体的错误位置。