为什么我收到此错误?错误:无法通过名称找到“类型”:'用户:#Default'

时间:2014-03-11 17:07:49

标签: javascript angularjs odata breeze datajs

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

Inspection of metadata (Not Working)

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

Inspection of metadata (Working)

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

我试过调用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>

3 个答案:

答案 0 :(得分:2)

@Adel问我要问的是什么。见Brian Noyes discussion of the issue。可悲的是,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();
}

来源: Open Data (OData)

答案 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)
);

它应该有用。