0

我正在尝试将 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 在我的项目中显示为:

检查元数据(不工作)

检查有效的样本,元数据看起来不同:

元数据检查(工作)

据我所知,我的设置代码与示例匹配。我也使用相同版本的库。查询永远不会触发,唯一的调用是获取 $metadata。

我曾尝试调用 fetchMetadata(),但它只是创建了对 /$metadata 的重复调用。

什么可能导致此错误消息?

更新:

这是 EDMX。我已经确认工作示例中只有 1 个模式。我无法弄清楚这个额外的模式是从哪里生成的。生成 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>

4

3 回答 3

2

@Adel 问我要问什么。请参阅Brian Noyes 对该问题的讨论。可悲的是,ODataConventionModelBuilder它并不忠实于 EDMX。

它变得更糟。ODataConventionModelBuilder不保留必要的外键信息,这意味着您真的不能将它用于 Breeze 应用程序。OData 团队承认存在缺陷。他们什么时候修复它?没人知道。

为什么要使用 Web API OData?为什么不直接使用 Web API ...我发现它几乎每次都更容易和更优越。我使用 Web API OData 的唯一原因是如果我必须将我的 Web api 暴露给我无法控制的客户端......也准备使用 OData 的客户端。

假设你有这么好的理由。

您是否注意到Web API OData 示例中的部分,我们建议您不要ODataConventionModelBuilder使用EdmBuilder. 你这样做吗?

于 2014-03-13T20:02:45.000 回答
1

Did you make the Users Collections exposed in WebApiConfig.cs in App_Start Folder?

public static IEdmModel GetEdmModel()
{
     ODataModelBuilder builder = new ODataConventionModelBuilder();
     builder.EntitySet<User>("Users");
     builder.Namespace = "SCATowel.Models"; 
     return builder.GetEdmModel();
}

Source: Open Data (OData)

于 2014-03-13T15:23:24.970 回答
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)
);

它应该工作。

于 2014-06-28T14:29:31.397 回答