Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Breeze js AutoGeneratedKeyType始终为';无';使用ODataConventionModelBuilder_Javascript_Angularjs_Entity Framework_Odata_Breeze - Fatal编程技术网

Javascript Breeze js AutoGeneratedKeyType始终为';无';使用ODataConventionModelBuilder

Javascript Breeze js AutoGeneratedKeyType始终为';无';使用ODataConventionModelBuilder,javascript,angularjs,entity-framework,odata,breeze,Javascript,Angularjs,Entity Framework,Odata,Breeze,我有一个简单的entityframework poco对象 public partial class Location: Entity { [Key] public int Id { get; set; } public string Description { get; set; } } 基类实体如下所示 public abstract class Entity : IObjectState { [NotMapped] public ObjectSta

我有一个简单的entityframework poco对象

public partial class Location: Entity
{
    [Key]
    public int Id { get; set; }
    public string Description { get; set; }
}
基类实体如下所示

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();
var-server=GlobalConfiguration.DefaultServer;
ODataModelBuilder=新ODataConventionModelBuilder();
builder.Namespace=“MyNameSpace.Models”;
builder.EntitySet(typeof(Location).Name);
var model=builder.GetEdmModel();
MapODataServiceRoute(“odata”、“odata”、模型、新的DefaultODataBatchHandler(服务器));
config.AddODataQueryFilter();
当我使用Breeze js使用此服务时,当我尝试使用manager.CreateEntity()创建实体时,我从Breeze得到一个错误

如果不先设置对象的属性,则无法将对象附加到EntityManager 键或将其entityType“AutoGeneratedKeyType”属性设置为 除了“没有”之外的其他东西

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

我将angular与客户端上的breeze结合使用,将Asp.net webapi 2与服务器上的odatacontroller结合使用,EntityFramework 6作为ORM


谁能告诉我我做错了什么

微软的ODataConventionModelBuilder非常不完整,他们也知道这一点(这适用于ODataWebAPI 2.1版和2.2版)。除了一些较小的问题外,它不支持“referentialConstraints”或存储生成密钥的任何信息。MS已经意识到这些问题,并表示其中一些问题将在10月份的某个时候在新版本中修复

在那之前,你有两个选择

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

    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客户端上描述元数据:(请参阅:)

  • 完全跳过OData并使用Breeze WebApi实现(请参阅)。它的优点是,它是breeze所有功能的最完整和最健壮的实现。breeze.js.samples中的大多数实体框架示例都是使用此方法构建的


一般来说,如果您有最后一个选择,我们真的建议您。请阅读此()以了解更多信息

我已经考虑了最后一个选项,但最后一个选项的问题是,我发现以这种方式应用业务逻辑和编程模式是非常不自然的。也许您可以给我举一个例子,其中最后一个选项与UnitofWork模式和repository模式结合使用。我不确定,这两种模式的服务器端api可以是相同的。唯一的区别可能是WebApi的基本用法。我的意思是,我必须使用EFContextProvider的beforesave事件之一,而不是在需要时按需要的顺序保存内容。这让我觉得有点不自然。实际上,如果你看看Breeze.js.samples repo中的NoDb示例,如果你愿意,你可以完全接管持久性操作,但它需要做更多的工作。和。。如果您正在使用EF并持久化实体图,则EF将为您的保存排序,而不是排序。