我正在尝试将OdataBreezeJSSample调整到我的项目中。元数据被调用并填充,但我的查询:
var people = breeze.EntityQuery
.from("Users")
.using(manager)
.select('Email')
.execute()
.then(function() {
})
.catch(function(err) {
var isEmpty = manager.metadataStore.isEmpty();
});
失败并显示错误消息:
错误:无法通过名称找到“类型”:'用户:#Default'。请务必先执行查询或调用fetchMetadata。
检查metadataStore在我的项目中显示为:
检查有效的样本,元数据看起来不同:
据我所知,我的设置代码与样本匹配。我也在使用相同版本的库。查询永远不会触发,唯一的调用是获取$元数据。
我试过调用fetchMetadata(),但它只是创建了对/ $ metadata的重复调用。
可能导致此错误消息的原因是什么?
更新:
这是EDMX。我已经确认工作样本中只有一个模式。我无法弄清楚这个额外的架构是从哪里生成的。生成EDM的所有代码都与样本匹配。
<xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<Schema Namespace="SCATowel.Models" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="User">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="Login" Type="Edm.String" />
<Property Name="Email" Type="Edm.String" />
<Property Name="IsAppAdmin" Type="Edm.Boolean" Nullable="false" />
<NavigationProperty Name="Sites" Relationship="SCATowel.Models.SCATowel_Models_User_Sites_SCATowel_Models_Site_SitesPartner" ToRole="Sites" FromRole="SitesPartner" />
<NavigationProperty Name="Settings" Relationship="SCATowel.Models.SCATowel_Models_User_Settings_SCATowel_Models_Setting_SettingsPartner" ToRole="Settings" FromRole="SettingsPartner" />
</EntityType>
<EntityType Name="Setting">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="SiteListLocation" Type="Edm.String" />
<NavigationProperty Name="User" Relationship="SCATowel.Models.SCATowel_Models_Setting_User_SCATowel_Models_User_UserPartner" ToRole="User" FromRole="UserPartner" />
</EntityType>
<EntityType Name="Site">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="Title" Type="Edm.String" />
<Property Name="Url" Type="Edm.String" />
<Property Name="IsSiteAdmin" Type="Edm.Boolean" Nullable="false" />
<Property Name="IsSiteOwner" Type="Edm.Boolean" Nullable="false" />
<NavigationProperty Name="User" Relationship="SCATowel.Models.SCATowel_Models_Site_User_SCATowel_Models_User_UserPartner" ToRole="User" FromRole="UserPartner" />
</EntityType>
<Association Name="SCATowel_Models_User_Sites_SCATowel_Models_Site_SitesPartner">
<End Type="SCATowel.Models.Site" Role="Sites" Multiplicity="*" />
<End Type="SCATowel.Models.User" Role="SitesPartner" Multiplicity="0..1" />
</Association>
<Association Name="SCATowel_Models_User_Settings_SCATowel_Models_Setting_SettingsPartner">
<End Type="SCATowel.Models.Setting" Role="Settings" Multiplicity="*" />
<End Type="SCATowel.Models.User" Role="SettingsPartner" Multiplicity="0..1" />
</Association>
<Association Name="SCATowel_Models_Setting_User_SCATowel_Models_User_UserPartner">
<End Type="SCATowel.Models.User" Role="User" Multiplicity="0..1" />
<End Type="SCATowel.Models.Setting" Role="UserPartner" Multiplicity="0..1" />
</Association>
<Association Name="SCATowel_Models_Site_User_SCATowel_Models_User_UserPartner">
<End Type="SCATowel.Models.User" Role="User" Multiplicity="0..1" />
<End Type="SCATowel.Models.Site" Role="UserPartner" Multiplicity="0..1" />
</Association>
</Schema>
<Schema Namespace="Default" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="Users" EntityType="SCATowel.Models.User" />
<EntitySet Name="Settings" EntityType="SCATowel.Models.Setting" />
<EntitySet Name="Sites" EntityType="SCATowel.Models.Site" />
<AssociationSet Name="SCATowel_Models_User_Sites_SCATowel_Models_Site_SitesPartnerSet" Association="SCATowel.Models.SCATowel_Models_User_Sites_SCATowel_Models_Site_SitesPartner">
<End Role="SitesPartner" EntitySet="Users" />
<End Role="Sites" EntitySet="Sites" />
</AssociationSet>
<AssociationSet Name="SCATowel_Models_User_Settings_SCATowel_Models_Setting_SettingsPartnerSet" Association="SCATowel.Models.SCATowel_Models_User_Settings_SCATowel_Models_Setting_SettingsPartner">
<End Role="SettingsPartner" EntitySet="Users" />
<End Role="Settings" EntitySet="Settings" />
</AssociationSet>
<AssociationSet Name="SCATowel_Models_Setting_User_SCATowel_Models_User_UserPartnerSet" Association="SCATowel.Models.SCATowel_Models_Setting_User_SCATowel_Models_User_UserPartner">
<End Role="UserPartner" EntitySet="Settings" />
<End Role="User" EntitySet="Users" />
</AssociationSet>
<AssociationSet Name="SCATowel_Models_Site_User_SCATowel_Models_User_UserPartnerSet" Association="SCATowel.Models.SCATowel_Models_Site_User_SCATowel_Models_User_UserPartner">
<End Role="UserPartner" EntitySet="Sites" />
<End Role="User" EntitySet="Users" />
</AssociationSet>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
答案 0 :(得分:2)
ODataConventionModelBuilder
并不忠实于EDMX。
情况变得更糟。 ODataConventionModelBuilder
不保留必要的外键信息,这意味着您实际上无法将其用于Breeze应用程序。 OData团队承认这一缺陷。他们什么时候修好?没有人知道。
为什么使用Web API OData?为什么不直接使用Web API ......我发现它几乎每次都更容易和更优越。我使用Web API OData的唯一原因是,如果我不得不将我的web api暴露给我无法控制的客户端......那些也准备使用OData的客户端。
让我们假设你有这么好的理由。
您是否注意到Web API OData Sample中我们建议不要使用ODataConventionModelBuilder
并引导您转到EdmBuilder
的部分。你在做吗?
答案 1 :(得分:1)
您是否在Users
文件夹的WebApiConfig.cs
中公开了App_Start
个收藏集?
public static IEdmModel GetEdmModel()
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<User>("Users");
builder.Namespace = "SCATowel.Models";
return builder.GetEdmModel();
}
答案 2 :(得分:0)
我遇到了同样的问题。
我认为这只是因为来自EF的元数据不适合微风。
喜欢它在这里解释http://www.breezejs.com/documentation/odata-server你只需要像nuget一样安装EdmBuilder:
Install-Package Breeze.EdmBuilder
然后将其添加到 WebApiConfig.cs :
config.Routes.MapODataRoute(
routeName: "odata",
routePrefix: "odata",
model: EdmBuilder.GetEdm<MyDbContext>(),
batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)
);
它应该有用。