无法从基本控制器访问具有int键的实体(Odata WebAPI)

时间:2016-04-24 08:34:20

标签: entity-framework rest model-view-controller odata asp.net-web-api2

我有一个基本控制器,它有一个Get方法,如下所示:

[Enable query]   
public T Get([FromOdataURI]string key)  
{  
  entity=GetDbSet().Find(key);  
}  

我无法修改find​​方法。它是一种从元数据文件派生的方法。

问题是Get方法接受键为字符串。因此,如果访问的实体具有字符串主键,

例如: http://hostname/service-name/employee(' 3000200')(此处' 3000200'在数据库中的类型为nvarchar),

调用基本控制器,并在基本控制器中定义的get方法将字符串主键与数据库中的字符串值进行比较。

但另一方面,如果访问具有整数键的实体,

例如:http://hostname/service-name/product(2)(这里2是数据库中的整数类型),

调用基本控制器并且Get方法仍然将键作为字符串,当代码将字符串键值与数据库中的整数键值进行比较时,它会返回一个错误,说明"参数类型为Edm.String和Edm.Int不兼容"。我不想为没有主键的实体创建单独的控制器作为字符串。如何在基本控制器的Get方法中处理不同的关键数据类型?

1 个答案:

答案 0 :(得分:0)

向基类添加第二个类型参数,用于指定键的类型。

public class BaseController<TKey, TEntity> : ODataController
{
    public TEntity Get([FromODataUri] TKey key) 
    {
        return GetDbSet().Find(key);
    }
}

当然,这种方法要求定义Find(TKey)