我正在创建一些供内部使用的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),我是否正在进行或者我必须做一些完全不同的事情?
提前致谢。