两个实体之间有非常简单的关系,我试图用asp.net webapi odata控制器暴露它们,但似乎$元数据有问题。
当我在$metadata上运行jaydatasvcutil.exe时,我得到警告:inverseProperty另一侧丢失。
当我使用breezejs loadNavigationProperty时,我得到类似的错误。
即使是官方的例子我也有问题。http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/working-with-entity-relations
您可以在这里观察$metadata http://sdrv.ms/Z5Klfw
请帮。
当我们生成导航属性时,我们不会重用这些关系。
例如,假设你有一个简单的模型,
public class Product
{
public int Id { get; set; }
public Supplier Supplier { get; set; }
}
public class Supplier
{
public int Id { get; set; }
public Product[] Products { get; set; }
}
我们生成的导航属性的$metadata看起来像这样,
<NavigationProperty Name="Supplier" Relationship="ProductsService.Models.ProductsService_Models_Product_Supplier_ProductsService_Models_Supplier_SupplierPartner" ToRole="Supplier" FromRole="SupplierPartner" />
<NavigationProperty Name="Products" Relationship="ProductsService.Models.ProductsService_Models_Supplier_Products_ProductsService_Models_Product_ProductsPartner" ToRole="Products" FromRole="ProductsPartner" />
注意,我们正在生成两个关系而不是一个关系。我们这样做的原因是很难弄清楚两个导航属性是否表示相同的关系。以Product和Manufacturer为例。
public class Manufacturer
{
public int Id { get; set; }
public Product[] RawMaterials { get; set; }
public Product[] Produces { get; set; }
}
public class Product
{
public int Id { get; set; }
public Manufacturer[] Producers { get; set; }
public Manufacturer[] Consumers { get; set; }
}
找出那个制造商不是件容易的事。原材料和产品。消费者应该和制造商建立同样的关系。生产者和产品。制作人也应该拥有同样的关系。我们选择不这样做,因为我们所知道的客户并没有从这些信息中得到很多。
这一切的发生是因为OData使用与实体框架相同的EDM模型。Entityframework需要这些信息,因为它将这些关系映射到将成为数据库中的表的关联集。
我们选择不这样做的另一个原因是,这可能会在OData V4中消失。请在这里查看工作草案(第23页和第57页将令人感兴趣)。简而言之,OData V4中$metadata中的导航属性看起来更像这样,
<NavigationProperty Name="Category" Type="Self.Category" Nullable="false" Partner="Products" />
注意这里没有关系,也没有关联集