2013-04-12 57 views
2

林在我的ASP.NET的WebAPI项目使用微风,我已经添加了breezecontroller微风,createEntity

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

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

不幸的是,当我打电话createEntity我得到的错误 如果不首先设定一个对象附加到一个EntityManager它的键或将其实体类型'AutoGeneratedKeyType'属性设置为'None'以外的其他值

元数据api被调用时,是不是轻松自动初始化实体?

TIA

回答

2

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

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

我打电话给intialize breezector breeze.NamingConvention.camelCase.setAsDefault(); var mgr = new breeze.EntityManager( { serviceName:config.remoteServiceName } ); –

7

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

如果是这样,那么在您创建实体之前,您需要设置密钥,然后才能将新实体添加到管理器。

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

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

  1. 在自定义的构造函数,您已经定义并与您已经定义并与类型注册在自定义初始化类型
  2. 登记(见“ Extending Entities“这两种技术的文档页面)
  3. 在初始化参数中调用createEntity

选项#3是这样的:

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

我会选选项#1自己。

+1

因此,当用户指定id(在我的情况下,长度为7的字符串)时,如何创建一个实体(并且返回值为KO可观察值)以用于“Add new XXX”窗体屏幕?你是否只指定一个非唯一的临时密钥(例如“tmpXXX”)并在保存时处理验证?有没有这样的例子? – zam6ak

+0

@Ward谢谢你的回答,它解决了我的问题。它看起来像getUuid()方法现在驻留在breeze.core中。您可能想要更新您的答案以反映这一点,以防止人们不得不自己弄清楚。 –

+0

谢谢。修复。我认为它总是在'breeze.core'中,而我刚刚有一个错字。 – Ward