早上好,
我在DB SQLServer上创建了一个带有EF的WebApi。我也使用了OData 4.0版。 我需要扩展模型以创建数据库中不存在的关系。
我以下列方式扩展了模型:
public partial class Clock
{
/*
OData needs this field, I don't want to modify EF mapping autogenerated files
*/
[Key]
public int ID
{
get { return this.ClockID; }
set { this.ClockID = value; }
}
public Interface
{
get
{
using (EF.DBClocksContainer db = new EF.DBClocksContainer())
{
return db.tbl_Interface.Where(x => x.ID == this.InterfaceID).SingleOrDefault();
}
}
set { throw new NotImplementedException(); }
}
我使用OData 4脚手架创建了一个新的控制器:然后我在EF模型的Clock实体和CRUD方法上有一个带OData 4的控制器。
返回IQueryable的GET方法很简单。只需应用odata查询:
[EnableQuery]
public IQueryable<Clock> GetClocks(ODataQueryOptions<Clock> queryOptions)
{
return db.tbl_Clock;
}
在global.asax文件中,除了设置路由规则等的WebApi注册外,我还为OData的规则添加了其他自定义注册:
Global.asax:
[…]
GlobalConfiguration.Configure(config =>
{
ODataConfig.Register(config); //this has to be before WebApi
WebApiConfig.Register(config);
});
[…]
ODataConfig:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes(); //This has to be called before the following OData mapping, so also before WebApi mapping
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Clock>("Clocks");
config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
}
现在错误......
使用Postman,做一个简单的GET,一切正常:
http://localhost:51432/odata/Clocks
我收到了第一级属性=&gt;的时钟列表不是'界面'提交。对于使用odata的“导航属性”,我们必须使用$ expand命令:
http://localhost:51432/odata/Clocks?$expand=Interface
现在我收到以下错误:
[…]
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.",
[…]
The specified type member 'Interface' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.",
[…]
但是,最奇怪的是:如果我使用$ expand方法执行单个元素GET,则所有正确的工作:
http://localhost:51432/odata/Clocks(2)?$expand=Interface
你有什么想法吗?
感谢。尼古拉。
我通过在EF模型中添加关联来解决。尼古拉。