Javascript Breeze js AutoGeneratedKeyType始终为';无';使用ODataConventionModelBuilder
我有一个简单的entityframework poco对象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
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将为您的保存排序,而不是排序。