我有一个简单的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。
有人可以告诉我我做错了什么!!!
答案 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)以获取更多信息。