gpt4 book ai didi

c# - 是否可以为单个实体类型设置多个 Controller ?

转载 作者:行者123 更新时间:2023-11-30 20:41:57 24 4
gpt4 key购买 nike

我有一个 Entity Framework 模型。假设我们有一个对象 Foo 和一个对象 Bar。它们是相关的,因此 Foo 具有到 Bar 的导航属性,反之亦然。

现在,对于我的 OData 端点,我希望有两个可用于 Foo 的集合,例如声明如下:

var builder = new ODataConventionModelBuilder { Namespace = "Test" };
builder.EntitySet<Foo>("Fools");
builder.EntitySet<Foo>("Footballs");
builder.EntitySet<Bar>("Bars");

这里的想法是,访问 Fools 将通过 FoolsController,访问 Footballs 将通过 FootballsController,这样我就可以返回不同的数据集每个端点。

但是,尝试这样做会导致以下 NotSupportedException 错误消息:

Cannot automatically bind the navigation property 'FooThing' on entity type 'Foo' for the entity set or singleton 'Bars' because there are two or more matching target entity sets or singletons. The matching entity sets or singletons are: Fools, Footballs.

我有点理解这个问题,但是如果我知道只有 Footballs 才会有 Bars,我有没有办法帮助系统理解 Bars 只会有 Footballs?

最佳答案

答案是肯定的。您可以调用许多流畅的 API 来手动设置绑定(bind),然后抑制约定绑定(bind)。例如:

HasManyBinding
HasRequiredBinding
HasOptionalBinding
HasSingletonBinding
...

根据您的信息,您可以调用以下方法手动进行绑定(bind):

builder.EntitySet<Bar>("Bars").HasRequiredBinding(b => b.FooThing, "Fools");

我还创建了一个简单的 Foo 和 Bar 类模型来进行测试。以下结果显示了元数据:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="WebApiTest" xmlns="http://docs.oasis-open.org/odata/ns/ed
m">
<EntityType Name="Foo">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
</EntityType>
<EntityType Name="Bar">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="FooThing" Type="WebApiTest.Foo" Nullable="fals
e" />
</EntityType>
</Schema>
<Schema Namespace="Test" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityContainer Name="Container">
<EntitySet Name="Fools" EntityType="WebApiTest.Foo" />
<EntitySet Name="Footballs" EntityType="WebApiTest.Foo" />
<EntitySet Name="Bars" EntityType="WebApiTest.Bar">
<NavigationPropertyBinding Path="FooThing" Target="Fools" />
</EntitySet>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

如您所见,“HasRequiredBinding”可以使导航属性不可为空,而“HasOptionBinding”可以使其为空。

希望对您有所帮助。谢谢。

关于c# - 是否可以为单个实体类型设置多个 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31831843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com