【发布时间】:2014-02-28 17:41:33
【问题描述】:
我有一个不使用实体框架或任何其他类型数据库的 OData 提供程序。
我使用以下 2 个模型:
public class ItemModel : TrackableBaseModel<Item>
{
[Key]
public Int32 ItemId { get; set; }
public String ItemName { get; set; }
public virtual ICollection<ItemSerialModel> ItemSerials { get; set; }
}
public class ItemSerialModel : TrackableBaseModel<ItemSerial>
{
public Int32 ItemSerialId { get; set; }
[ForeignKey("Item")]
public Int32? ItemId { get; set; }
public ItemModel Item {get;set; }
}
但 OData $metadata 显示:
<EntityType Name="ItemModel">
<Key>
<PropertyRef Name="ItemId"/>
</Key>
<Property Name="ItemId" Type="Edm.Int32" Nullable="false"/>
<Property Name="ItemName" Type="Edm.String"/>
<NavigationProperty Name="ItemSerials" Relationship="UserSite.Models.UserSite_Models_ItemModel_ItemSerials_UserSite_Models_ItemSerialModel_ItemSerialsPartner" ToRole="ItemSerials" FromRole="ItemSerialsPartner"/>
</EntityType>
<EntityType Name="ItemSerialModel">
<Key>
<PropertyRef Name="ItemSerialId"/>
</Key>
<Property Name="ItemSerialId" Type="Edm.Int32" Nullable="false"/>
<Property Name="ItemId" Type="Edm.Int32"/>
<NavigationProperty Name="ItemModel" Relationship="UserSite.Models.UserSite_Models_ItemSerialModel_ItemModel_UserSite_Models_ItemModel_ItemModelPartner" ToRole="ItemModel" FromRole="ItemModelPartner"/>
</EntityType>
但这没有多大意义,它带有ItemModelPartner,甚至在项目中都不存在。
如何设置手动 FK,以便导航属性在 OData 中起作用?
WebApiConfig 像这样定义模型:
builder.EntitySet<ItemModel>("Items").EntityType.HasKey(x => x.ItemId);
builder.EntitySet<ItemSerialModel>("ItemSerials").EntityType.HasKey(x => x.ItemSerialId);
【问题讨论】:
-
除了
ItemModel.Item属性之外还有外键的原因是什么?ItemSerialModel.Item.ItemId是否有可能不等于ItemSerialModel.ItemId?如果这两个总是相等的,我认为你根本不需要ItemSerialModel.ItemId。生成的 $metadata 有什么意义? ItemModelPartner 和 ItemSerialsPartner 可能是自动生成的。它们描述了实体集如何通过此导航属性相互映射。除非您有多个具有相同类型的实体集,否则我不会太担心它们。 -
好吧,问题是当我尝试从中查询时,它会抛出无法找到 ItemPartner 控制器的异常......这很奇怪,因为它甚至不存在。
-
哦,我明白了。这是使用 ASP.Net Web API 吗?我自己对 Web API 不是很熟悉,所以我不确定模型是如何实际创建的,但我认为将这些信息(和错误消息)添加到您的问题中会有所帮助。
-
模型是手工创建的 :) 正如我所说,没有底层提供者,但它都是手工完成的。
-
如果您使用的是WebApi,能否请您发布您的IEdmModel?
标签: c# odata asp.net-web-api