我有对象"舞台细节",当我创建新实体这个对象时, 然后breeze自动创建主键,如-1,-2,-3,-4等。 保存此对象后,我看到保存的第一个对象是最后一个, 这是记录-4,它是我对象列表中的最后一条记录。我需要按顺序保存在breezejs中。
我想管理服务器端的订单。我正在使用EFContextProvider,我想在保存更改之前管理订单。我的代码是
public SaveResult Save(JObject saveBundle)
{
//i want to manage order in this position
return _contextProvider.SaveChanges(saveBundle);
}
有可能吗?感谢。
答案 0 :(得分:1)
在必须按照客户端只知道的特定顺序在数据库中创建记录的情况下,您可以多次调用EntityManager.saveChanges
以按应用程序所需的顺序保存实体。以下代码说明了强制Breeze在后端数据库中保存一组实体的方法,其顺序与它们在实体数组中的显示顺序相同:
var entityManager = /* your Breeze entity manager */;
var arrayOfEntities = [/* array of entities that have been added to entityManager, in order they must be created */];
var saveEntities = function(i) {
if (arrayOfEntities.length > i) {
var e = arrayOfEntities[i];
entityManager.saveChanges([e]).then(function() { saveEntities(i + 1); });
// Error handling upon failure left as an exercise
}
};
saveEntities(0);
这显然会导致多个HTTP操作被执行,但由于我认为它是客户端代码,这是关于排序知识的地方,我认为这将是不可避免的。更好的方法可能是考虑您是否真的需要以特定顺序保存/创建实体:在某种情况下,相同类型的其他无关实体的创建顺序确实很重要,这听起来有点不寻常。
答案 1 :(得分:0)
不太确定他需要什么。 (这可能导致多次调用服务器,这在大多数情况下都是不需要的) 据我所知,微风应该知道每个实体应该保存的顺序。 如果它不像你期望的那样工作那么它可能是映射问题\元数据问题 但如果你选择樱桃选择(按照你想要的顺序制作自己的保存包),那么微风将按顺序保存实体。 您可以通过所需的实体类型从管理器中获取实体,并过滤掉您不希望删除或未更改的状态。
这应该适用于NH我从来没有在EF上测试过这个但是我觉得它应该是相同的
希望这有帮助
答案 2 :(得分:0)
我通过质疑你的id序列重要的前提来开始我的回答。
由于您使用的是EFContextProvider
,因此您知道保存是事务性的,并且所有批处理项目都将保存在一起,或者它们都不会保存。如果服务器碰巧按照在客户端上创建的项目的相反顺序保存项目,则您不会丢失数据完整性。
关系数据库没有保存顺序的概念,并且从根本上不明智地关心密钥的含义或顺序。这些都是商店生成的密钥,所以你为什么关心?
此外,Entity Framework可以任意顺序保存相同类型的项目。您无法知道其他用户是否会在您之前或之后完成保存。如果您尝试单独的saveChanges
来电,则可能是其他用户会在"批次"中间插入项目。
如果你试图管理EF的ID生成,那么你可以尝试重新排列BeforeSaveEntities
method内的SaveMap
对象中的实体,这可能适用于大多数时间。
我会不进行多次saveChanges
调用,因为它必然会损害客户端和服务器的性能,破坏事务完整性,并导致其他令人头疼的事情,而不确定您是否满意你的意图。