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

时间:2015-08-26 00:27:29

标签: asp.net-web-api odata

我正在创建一些供内部使用的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..
}

Simplified 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]注释移至电子邮件,然后移至WebApiConfig 更改builder.EntitySet<Contact>("Contacts");

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

我还将控制器中的键输入参数从int更改为string 它创建了Id和电子邮件的复合键

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

http://xxx:52759/odata/Contacts('some@email.com')如果我使用fiddler测试,但我的第三方应用程序读取元数据并要求我传入Id和电子邮件,我没有ID那个时候。

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

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

如果我想通过电子邮件联系(以这种方式获取回复的ID),我是否正在进行或者我必须做一些完全不同的事情?

提前致谢。

0 个答案:

没有答案