2

我在我的 ASP.NET WebAPI 项目中使用微风,我添加了微风控制器

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

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

不幸的是,当我调用 createEntity 时,我收到错误 Cannot attach an object to an EntityManager without first setting its key or setting its entityType 'AutoGeneratedKeyType' property to something other than 'None'

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

TIA

4

2 回答 2

7

我敢打赌,您尝试创建的实体是这样定义的,即客户端……而不是服务器……负责设置唯一键。我敢打赌,关键属性是一个 Guid,因为 EF Code First 假设 Guid 关键属性是由客户端默认确定的。

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

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

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

  1. 在您定义并使用类型注册的自定义构造函数中
  2. 在您定义并使用类型注册的自定义初始化程序中(请参阅“扩展实体”文档页面了解这两种技术)
  3. createEntity调用的初始化参数中。

选项 #3 如下所示:

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

我自己会选择选项#1。

于 2013-04-17T07:59:08.090 回答
2

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

breezeProjectManager().metadataStore.fetchMetadata().then(function() {
  //createEntity code here 
}
于 2013-04-12T17:17:55.017 回答