使用BreezeJS / Angular / WebAPI(OData),我已经设置了一个项目,我可以通过以下方式调用GET:
breeze.EntityQuery
.from(resource)
.using(manager)
.execute()
.then(function (data) {
deferred.resolve(data.results);
});
但是,当我尝试使用以下命令保存更改或创建新实体时
var type = manager.metadataStore.getEntityType(model);
type.setProperties({
autoGeneratedKeyType: breeze.AutoGeneratedKeyType.KeyGenerator
});
var newM = manager.createEntity(type, m);
manager.saveChanges().then(function () { alert('success'); }, function (error) { prompt("", JSON.stringify(error)); });
我收到错误:
“找不到与请求URI'http://localhost:57508/odata/odata/Models'”匹配的HTTP资源
这很奇怪,因为URL错误。它有服务网址和额外的'odata'。
我的AngularJS工厂非常简单:
app.factory("EntityManagerFactory", ['breeze', function (breeze) {
configureBreeze();
var serviceRoot = window.location.protocol + '//' + window.location.host + '/';
var serviceName = serviceRoot + 'odata/';
var factory = {
manager: newManager,
serviceName: serviceName,
metadataStore: {}
};
return factory;
function configureBreeze() {
// use Web API OData to query and save
breeze.config.initializeAdapterInstance('dataService', 'webApiOData', true);
// convert between server-side PascalCase and client-side camelCase
// breeze.NamingConvention.camelCase.setAsDefault();
}
function newManager() {
var mgr = new breeze.EntityManager(serviceName);
mgr.fetchMetadata().then(function () {
//var modelType = manager.metadataStore;
});
return mgr;
}
}]);
我不确定在哪里可以查找添加到生成的网址的额外“odata”。从serviceName中删除'odata'会阻止GET正常工作。
非常感谢。
答案 0 :(得分:1)
你不应该打破BREEZE !!!
没有必要解决这个问题,并且修补微风会使我们升级的能力变得更加复杂,因为我们每隔2或3周发布一次新版本。
我们知道您提出的问题和https://github.com/Breeze/breeze.js.samples/issues/31的讨论。我们将对此采取一些措施......我们还没有确定我们将做些什么。
但与此同时,您可以应用首选的解决方法而不更改Breeze。
那是因为我们为“webApiOData”适配器制作了getRoutePrefix
已发布的扩展点。
例如,您可以像@ user2908937建议的那样完成,而无需更改Breeze源代码行。
只需在应用程序设置逻辑中覆盖该扩展方法......就像这样。
function configureBreeze() {
// choose and get the Web API OData DataServiceAdapter
var adapter = breeze.config.initializeAdapterInstance(
'dataService', 'webApiOData', true);
// override the getRoutePrefix instance method
adapter.getRoutePrefix = function (dataService) {
return "";
};
// ... more configuration ...
}
这不是黑客行为。这正是我们暴露这种方法的原因。
好问题。
ASP.NET Web API OData实现经历了如此多的流失和许多重大变化,我们一直在努力跟上,直到我们看到稳定性和正确的行为。 $ $批量内部网址是他们最近破解的内容之一。这会让我们感到痛苦,但与其他所有破坏的东西相比,这是一个很小的问题。我们更倾向于通过1000次削减来全面解决死亡问题。
最近与MS团队的对话令人鼓舞。我们打算尽快再次同步。
与此同时,您可以按照我在此建议的方式处理这个特定问题。
答案 1 :(得分:0)
看起来这是Breeze的一个错误,也许是绝对与相对网址的意外后果:
https://github.com/Breeze/breeze.js.samples/issues/31
基本上,如果你在breeze.debug.js中的第16573-16575行注释掉代码:
if (prefix[0] === '/') {
prefix = prefix.substr(1);
} // drop leading '/' (all but IE)
这只能修复Chrome / Firefox。为了解决所有问题,我只是在函数的开头返回一个空字符串:
webApiODataCtor.prototype.getRoutePrefix = function (dataService) {
return "";
// Removed Code
};
那就像魅力一样。猜猜我会让.NET缩小js文件。