【问题标题】:Breeze, createEntity微风,创建实体
【发布时间】:2013-04-05 05:57:06
【问题描述】:

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

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

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

不幸的是,当我调用 createEntity 时,我得到了错误 如果不先设置对象的键或将其 entityType 'AutoGeneratedKeyType' 属性设置为 'None' 以外的值,则无法将对象附加到 EntityManager

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

TIA

【问题讨论】:

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


    【解决方案1】:

    我敢打赌,您尝试创建的实体是这样定义的,即客户端……而不是服务器……负责设置唯一键。我敢打赌,关键属性是一个 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。

    【讨论】:

    • 那么当用户指定id(在我的例子中为长度 7)?您是否只是指定一个非唯一的临时密钥(例如“tmpXXX”)并在保存时处理验证?有没有这方面的例子?
    • @Ward 感谢您的回答,它解决了我的问题。看起来 getUuid() 方法现在驻留在微风核心中。您可能需要更新您的答案以反映这一点,以免人们不得不自己弄清楚。
    • 谢谢。修复。我认为它总是在breeze.core 中,我只是有一个错字。
    【解决方案2】:

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

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

    【讨论】:

    • 我调用它来初始化breezectorbrewer.NamingConvention.camelCase.setAsDefault(); var mgr = new 微风.EntityManager( { serviceName: config.remoteServiceName } );
    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 2014-11-02
    • 2014-04-08
    • 1970-01-01
    • 2013-03-22
    • 2019-11-01
    • 2013-05-17
    • 2015-04-20
    相关资源
    最近更新 更多