【问题标题】:Maintaining the insert order with Breeze使用 Breeze 维护插入顺序
【发布时间】:2013-08-01 19:19:01
【问题描述】:

为将来偶然发现此问题的人编辑。

这不是一个轻而易举的问题,它是一个 EF 问题,并且在 SO 上已被多次询问。喜欢herehere

我正在使用带有 Knockout 的 Breeze。我正在创建实体并将它们推送到数组中,当将更改保存到服务器时,数据最终的顺序与在客户端上推送的顺序不同。我正在使用 Web API 和实体框架。

Javascript 代码如下所示:

var owner = manager.createEntity('OwnerInformation');
licApp().owners.push(owner);

在调用SaveChanges 之前,数组如下所示:

SaveChanges 被调用时,saveBundle 看起来像这样(为简洁起见,省略了很多其他信息)

{"entities": [
  {
    "Id": 2008,

  {
    "Id": -3,
    "LicensingApplicationId": 2008,
    "FirstName": "First",
    "LastName": "Owner",
  },
  {
    "Id": -4,
    "LicensingApplicationId": 2008,
    "FirstName": "Second",
    "LastName": "Owner",
  }
]}

但是保存到数据库后结果是这样的(第一列是id):

为什么它们被向后插入?

【问题讨论】:

  • 我之前也遇到过类似的问题,之后我就再也没有看到过 - 我认为可能是错误的,这与我设置导航属性的方式有关(听起来很疯狂)但是您是否尝试过 owner().licApp(licApp()) 而不是将所有者添加到 licApp?
  • @PWKad 结果还是一样!

标签: entity-framework knockout.js breeze


【解决方案1】:

我有一个更高阶的问题要问你。你为什么在乎?您正在使用关系数据库。订单未定义。如果你关心订单,你的数据应该有一些东西可以订购。

我不想刻薄。老实说,我相信保存订单的期望会让你失败。以其他方式说服我。我已经准备好学习了。

p.s.:我认为 Breeze 与它没有任何关系......在客户端或服务器上。我敢打赌你用的是EF。鉴于所涉及的原则,我一直无法预测 EF 的保存顺序......我也懒得尝试。

【讨论】:

  • 病房,我正在使用 EF。顺序很重要,因为在这种情况下,第一项是主要的。我在 orderby 上看到了您的观点,但如果我通过插入语句将记录直接插入数据库,我希望这会以相同的方式运行。只有标识键(没有其他索引)的 SQL Server 表将自动按标识排序。但是,如果问题出在 EF 上,我想从 Breeze 的角度来看没有什么可以做的。
  • 其实在没有OrderBy子句的情况下,查询实际上是按Id顺序返回的。对您来说不幸的是,这是在您从您的角度将它们“向后”插入数据库之后。您选择让 EF 进行插入并让数据库生成您的密钥。目前我没有很好的答案给你。从来没有。
  • 您知道您可以称我为虚张声势,看看您是否可以让 EF 尊重您将它们添加到其 DbContext 的顺序。如果您可以让 EF 以特定顺序插入它们(请记住临时键是负数),那么我将再次查看是否有我们可以做的事情。但我认为你根本无法控制 EF 的插入顺序
  • 刚刚使用 SQL Server Profiler 确认插入语句确实以错误的顺序发送。我会进一步调查,看看是否可以解决。
  • 看来这确实是 EF 的事情,仅基于 StackOverflow 中关于同一问题的问题数量。我实施了您的建议并添加了一个 Ordering 列,我在检索所有者时对其进行排序。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2011-02-27
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多