Breeze,createEntity

时间:2013-04-12 15:58:26

标签: asp.net-mvc asp.net-web-api breeze asp.net-spa

我在ASP.NET WebAPI项目中使用Breeze,我添加了breezecontroller

    [BreezeController]    
    public class BreezeController : ApiController
    {
        readonly EFContextProvider<MyEntities> _context 
            = new EFContextProvider<MyEntities>();

        [HttpGet]
        public string Metadata()
        {
           return _context.Metadata();
        }

不幸的是,当我调用createEntity时,我得到了错误 如果没有先设置其密钥或将其entityType'AutoGeneratedKeyType'属性设置为“无”以外的其他内容,则无法将对象附加到EntityManager

当调用元数据api时,不是breeze自动初始化实体吗?

TIA

2 个答案:

答案 0 :(得分:7)

我打赌你正在尝试创建的实体被定义为客户端...而不是服务器......负责设置唯一密钥。我敢打赌,关键属性是Guid,因为EF Code First假设Guid密钥属性是由客户端默认确定的。

如果是这样,那么在您将新实体添加到管理器之前,由您在创建实体时设置密钥。

您已选择使用EntityManager.createEntity方法创建新实体。这也是我的最爱。

但您必须记住,此方法会尝试自动将新实体添加到管理器中(如here所述)。因此,要使用此方法,必须在Breeze将其添加到管理器之前初始化新实体的密钥。您可以通过以下三种方式之一来实现:

  1. 在您已使用类型
  2. 定义和注册的自定义构造函数中
  3. 在您已定义并使用该类型注册的自定义初始值设定项中(有关这两种技术,请参阅“Extending Entities”文档页面)
  4. createEntity来电的初始化参数中。
  5. 选项#3如下所示:

    var newThing = manager.createEntity("Thing", {id: breeze.core.getUuid()});
    

    我会自己选择#1选项。

答案 1 :(得分:2)

请发布您的客户端微风代码。没有它我无法确定,但我猜你在“createEntity”调用之前没有为该实体获取元数据。您必须先拥有metadataStore才能创建实体。例如:

breezeProjectManager().metadataStore.fetchMetadata().then(function() {
  //createEntity code here 
}