我有一个OData提供程序,它不使用Entity Framework或任何其他类型的数据库。
我使用以下两种模式:
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 $元数据显示:
<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);
答案 0 :(得分:2)
尝试将EdmModel更改为如下。
ODataConventionModelBuilder v1ODataConventionModelBuilder = new ODataConventionModelBuilder();
v1ODataConventionModelBuilder.EntitySet<ItemModel>("ItemModels");
v1ODataConventionModelBuilder.EntitySet<ItemSerials>("ItemSerials");
config.Routes.MapODataRoute("routename", "routeprefix/", v1ODataConventionModelBuilder.GetEdmModel()
您还应该能够删除以下属性
[ForeignKey("Item")]
public Int32? ItemId { get; set; }
答案 1 :(得分:1)
对于ItemSerialModel,您应该在最后一行添加“virtual”。就像你在ItemModel中所做的一样。
public class ItemSerialModel : TrackableBaseModel<ItemSerial>
{
public Int32 ItemSerialId { get; set; }
[ForeignKey("Item")]
public Int32? ItemId { get; set; }
public virtual ItemModel Item {get;set; }
}
至于Edm Model,你应该做Schandlich建议的事情。希望这会有所帮助。