WebAPI W OData& EF:导航属性错误

时间:2016-08-10 13:23:29

标签: c# angularjs entity-framework asp.net-web-api odata

早上好,

我在DB SQLServer上创建了一个带有EF的WebApi。我也使用了OData 4.0版。 我需要扩展模型以创建数据库中不存在的关系。

  • 我有一个实体CLOCK和另一个INTERFACE(1个界面 - N个时钟)
  • 我以下列方式扩展了模型:

    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模型中添加关联来解决。尼古拉。

0 个答案:

没有答案