在breezejs SaveChanges中重新订购

时间:2014-07-21 17:05:31

标签: breeze

我有对象"舞台细节",当我创建新实体这个对象时, 然后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);
}

有可能吗?感谢。

3 个答案:

答案 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调用,因为它必然会损害客户端和服务器的性能,破坏事务完整性,并导致其他令人头疼的事情,而不确定您是否满意你的意图。