Web API OData V3通过字符串(电子邮件)获取实体



我正在创建一些内部使用的Web API,其中一个与之交互的第三方应用程序只能使用odata v3(即不能使用odata v4)。

我正试图从这个Web API查询另一个第三方应用程序-通过电子邮件获得联系人,但不确定如何通过字符串而不是id获得它。

我有一个这样的简化模型:

public class Contact
{
    [Key]
    public int Id { get; set; }
    public string Email { get; set; }
    public string CompanyName { get; set; }
}
简化控制器:

public IHttpActionResult GetContact([FromODataUri] int key)
{
    var contact = _repository.GetContact(key);
    // return..
}
简化WebApiConfig

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
var container = new UnityContainer();
container.RegisterType<IContactRepository, ContactRepository>(new ContainerControlledLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
builder.EntitySet<Contact>("Contacts");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());

如果我查看元数据文档,它显示了预期的Id:

<EntityType Name="Contact">
<Key>
<PropertyRef Name="Id"/>
</Key>

在我的模型中,如果我移动[Key]注释到电子邮件,然后在WebApiConfigchange builder.EntitySet<Contact>("Contacts");

builder.EntitySet<Contact>("Contacts").EntityType.HasKey(c => c.Email); 

我还将控制器中的键输入参数从int改为string生成Id和Email的复合键

<EntityType Name="Contact">
<Key>
<PropertyRef Name="Email"/>
<PropertyRef Name="Id"/>
</Key>

http://xxx:52759/odata/Contacts('some@email.com')如果我使用fiddler进行测试,但我的第三方应用程序读取元数据并要求我通过Id和Email,我当时没有Id。

如果我在我的模型中将Id重命名为cId之类的东西,它不再是元数据中关键的一部分,但我不认为这是正确的方法?

<EntityType Name="Contact">
<Key>
<PropertyRef Name="Email"/>
</Key>

如果我想通过电子邮件获得联系人(并以这种方式获得回复的id),我是否要做一些完全不同的事情?

你应该传递int Id和Email,它是一个复合键,在你的情况下,我认为你的意思是AlternateKey,这是支持在V4 https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataAlternateKeySamples

最新更新