繁体   English   中英

为什么会出现此错误? 错误:无法通过名称找到“类型”:'User:#Default'

[英]Why am I getting this error? Error: Unable to locate a 'Type' by the name: 'User:#Default'

我正在尝试将OdataBreezeJSSample适配到我的项目中。 元数据被调用并填充,但是我的查询是:

var people = breeze.EntityQuery .from("Users") .using(manager) .select('Email') .execute() .then(function() { }) .catch(function(err) { var isEmpty = manager.metadataStore.isEmpty(); });

失败并显示错误消息:

错误:无法通过名称“用户:#Default”找到“类型”。 确保执行查询或首先调用fetchMetadata。

检查metastore在我的项目中显示为:

检查元数据(无效)

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

检查元数据(工作中)

据我所知,我的设置代码与示例匹配。 我也使用相同版本的库。 该查询从不触发,唯一的调用是获取$ 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>

@Adel问我要问什么。 请参阅Brian Noyes对此问题的讨论 遗憾的是, ODataConventionModelBuilder对EDMX不忠实。

情况变得更糟。 ODataConventionModelBuilder不会保留必要的外键信息,这意味着您确实不能将其用于Breeze应用程序。 OData团队承认这一缺陷。 他们什么时候会解决? 没人知道。

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

假设您有如此充分的理由。

您是否注意到Web API OData示例中的部分,建议不要使用ODataConventionModelBuilder并将其定向到EdmBuilder 你在那样吗

您是否在App_Start文件夹的WebApiConfig.cs中公开了Users集合?

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

来源: 开放数据(OData)

我有同样的问题。

我认为这仅仅是因为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)
);

它应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM