OData没有数据库但有外键

时间:2014-02-04 16:13:47

标签: c# odata asp.net-web-api

我有一个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);

2 个答案:

答案 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建议的事情。希望这会有所帮助。