【问题标题】:Breeze.js : how to store an entity relation using the OData adapterBreeze.js:如何使用 OData 适配器存储实体关系
【发布时间】:2013-05-16 16:24:00
【问题描述】:

我的目标是在我的 OData 服务器上保持两个微风实体之间的简单关系。

我已经设置了一个服务器,我可以:

  • 插入数据
  • 查询数据
  • 在客户端的两个实体之间创建关系
  • 但是无法在服务器端保持关系。

关于我缺少什么的任何想法?

以下是我的设置详情


  • 我正在使用在 Node.js(virtualBox、ubuntu 12.04、node.js、MongoDB)上运行 JayData 的 OData/MongoDB 后端
  • 我创建了一个简单的数据模型,其中包含一个基于this stack overflow question 的用户和个人实体。这是 JayData 数据模型定义

>

$data.Class.define("$org.Types.user", $data.Entity, null, {
    Id: {type: "id", key: true, computed: true, nullable: false },
    Person: { type: "$org.Types.person", inverseProperty: "User", required:true },
    EmailAddress: { type: "string"},
    Password: { type: "string"}
}, null)

$data.Class.define("$org.Types.person", $data.Entity, null, {
    Id: {type: "id", key: true, computed: true, nullable: false },
    User: { type: "$org.Types.user", inverseProperty: "Person"},
    FirstName: { type: "string"},
    LastName: { type: "string"}
}, null);


$data.Class.defineEx("$org.Types.Context", [$data.EntityContext, $data.ServiceBase], null, {
    User: {type: $data.EntitySet, elementType: $org.Types.user } ,
    Person: {type: $data.EntitySet, elementType: $org.Types.person }
});

exports = $org.Types.Context;
  • 我可以使用 Breeze.js 查询数据
  • 我可以使用 Breeze.js 插入 User 和 Person 实体
  • 我可以在 Breeze 中设置关系,并且可以看到实体的变化
  • 我已将 Breeze.js 更新到 1.3.3

>

var manager = new breeze.EntityManager('api/');
// other breeze initialization stuff, metadata etc.

var person = manager.createEntity('Person', undefined, breeze.EntityState.Detached);
var user = manager.createEntity('User', undefined, breeze.EntityState.Detached);

// set other fields, name, email, password
user.Person(user);
manager.addEntity(user);
manager.addEntity(person);

// save the changes
manager.saveChanges().then(function() { // etc

但我只看到两个实体的两个 OData 帖子,但没有将两个实体联系在一起

  • 我排除了 OData 适配器,因为 WebAPI 和 OData 适配器在 Breeze 代码库中调用相同的函数,并且有多个 Breeze/WebAPI 展示了查询和插入相关实体的能力。
  • 我还没有看到似乎可以解决此问题的 Breeze.js / OData 示例。
  • 最接近的例子是datajs code sample。它将相关实体发布到 /$links/ 以创建关系(我在 Breeze.js 或 JayData 的 OData 适配器中都没有看到)。

【问题讨论】:

    标签: odata breeze jaydata


    【解决方案1】:

    我从未将 Breeze 与 JayData 服务器一起使用,但我一直使用 JayData client library 通过 OData 保存数据一年,它适用于静态模式(您使用 JaySvcUtil 生成它)和动态模式(获取元数据在运行时从服务器)以及。ű

    重要的事情:

    • 使用类型化的实体,而不是 POCO 对象
    • 设置关系的必需端以使项目持久化

      <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
      <script src="http://include.jaydata.org/datajs-1.0.3.min.js"></script>
      <script src="http://include.jaydata.org/jaydata.js"></script>
      <script>
              var url = 'http://localhost:54001/personService';
      
              $data.service(url, function(contextFactory, contextType){
                  var db = contextFactory();
                  db.onReady(function(){
      
                      var user = new db.User.elementType({ EmailAddress: 'joe.smith@company.org'});
                      var person = new db.Person.elementType({ FistName: 'Joe', LastName: 'Smith', User: user }); //set the value to the required side of the relationship to have your entities saved in the batch
                      db.Person.add(person)
      
                      db.saveChanges(function () {
                          db.Person.include('User').toArray(function (p) { console.log(p);});
                      });
                  })
              });
      

    免责声明:我是 JayData 开发团队的成员,因此您也可以在服务器端为您提供帮助。

    【讨论】:

    • 感谢代码工作并发出预期值。虽然我在尝试保存 Person 时在服务器端收到错误,但我收到以下“TypeError:Object #
    • 在使用新的odata-server npm module 时有效。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2012-11-28
    相关资源
    最近更新 更多