Breeze js AutoGeneratedKeyType始终是' none'使用ODataConventionModelBuilder

时间:2014-08-21 11:19:48

标签: javascript angularjs entity-framework odata breeze

我有一个简单的entityframework poco对象

public partial class Location: Entity
{
    [Key]
    public int Id { get; set; }
    public string Description { get; set; }
}

baseClass实体看起来如下

public abstract class Entity : IObjectState
{
    [NotMapped]
    public ObjectState ObjectState { get; set; }
}

我使用ODataConventionModelBuilder

通过Odata服务公开此对象
        var server = GlobalConfiguration.DefaultServer;
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.Namespace = "MyNameSpace.Models";
        builder.EntitySet<Location>(typeof(Location).Name);
        var model = builder.GetEdmModel();
        config.Routes.MapODataServiceRoute("odata", "odata", model, new DefaultODataBatchHandler(server));


        config.AddODataQueryFilter();

当我使用Breeze js使用此服务时,当我尝试使用manager.CreateEntity()创建实体时,我从微风中收到错误。

  

如果没有先设置对象,则无法将对象附加到EntityManager   键入或设置其entityType&#39; AutoGeneratedKeyType&#39;财产到   除了&#39; <&#39;

以外的其他内容

当我查询实体并编辑数据并保存时。一切都好。

我在客户端和Asp.net webapi 2上结合使用angular与服务器上的odatacontroller结合使用了EntityFramework 6作为ORM。

有人可以告诉我我做错了什么!!!

1 个答案:

答案 0 :(得分:2)

Microsoft的ODataConventionModelBuilder非常不完整,他们都知道它(这适用于OData WebApi v 2.1和v 2.2)。除了一些较小的问题,它不支持'referentialConstraints'或商店生成的密钥的任何信息。 MS已经意识到这些问题,并且已经说过其中一些问题将在10月的某个时候修复。

在那之前你有几个选择。

  • 使用ODataConventionBuilder但在获取元数据后更新breeze的metadataStore以“修复”丢失或错误的元数据。

    myMetadataStore.metadataFetched.subscribe(function(args) {
      var ms = args.metadataStore;
      var entityType = ms.getEntityType("Customer");
      entityType.setProperties({ autoGeneratedKeyType: AutoGeneratedKeyType.Identity });
      dp = entityType.getDataProperty("companyName");
      dp.validators.push(Validator.maxLength({ maxLength: 40 }));
      // etc... 
    });
    
  • 完全避免从服务器获取元数据,只需直接在breeze客户端上描述元数据:(参见:http://www.breezejs.com/documentation/metadata-by-hand

  • 完全跳过OData并使用Breeze WebApi实现(请参阅http://www.breezejs.com/documentation/aspnet-web-api)。这有利于成为所有微风功能中最完整和最强大的实现。 breeze.js.samples中的大多数Entity Framework示例都是使用此构建的。

一般情况下,如果您可以使用,我们真的推荐最后一个选择。请阅读此文件(http://www.breezejs.com/documentation/odata-server)以获取更多信息。