OData WebAPI实践-OData与EDM

本文属于OData系列引言在OData中,EDM(EntityDataModel)代表“实体数据模型”,它是一种用于表示WebAPI中

本文属于 OData 系列


(资料图片)

引言

在 OData 中,EDM(Entity Data Model) 代表“实体数据模型”,它是一种用于表示 Web API 中的结构化数据的格式。EDM 定义了可以由 OData 服务公开的数据类型、实体和关系。EDM 也提供了一些规则来描述数据模型中的实体之间的关系,例如继承、关联和复合类型。EDM 是 OData 协议的核心组成部分之一,它允许客户端和服务器之间以一致的方式交换和操作数据。

EDM 与实体对象模型

我刚接触 EDM 时恰好是与 EF Core 一起使用,就非常不理解这个现象:明明已经在 EF Core 中已经定义了模型,为啥还需要单独配置一个 EDM?

其实,EDM 和实体框架(EF)Core 中的实体对象虽然都用于数据建模,但却是不同的概念:在 EF Core 中,实体对象表示数据库中的表或视图,而 EDM 定义了 OData 服务中的数据结构,包括实体、属性、导航属性等。可以理解实体对象是为数据库服务,而 EDM 是用于数据开放服务的

虽然 EDM 和 EF Core 中的实体对象都具有一些相似之处,例如它们都有属性和关系,甚至你也可以直接返回实体模型用提供给 OData 让其动态自动生成 EDM 模型(Non-ODM 模式),但是依然建议使用 EDM 模型,主要是有几个方面:

实体框架中的实体类可能包含与 OData 服务定义不同的属性。例如,实体框架中的实体类可能包含用于持久化和跟踪状态的属性,而这些属性可能并不需要在 OData 服务中公开。实体框架中的实体类可能使用与 OData 服务定义不同的命名约定。例如,实体框架中的实体类可能使用 PascalCase(首字母大写)命名约定,而在 OData 服务中的 EDM 可以使用 camelCase(首字母小写)命名约定。实体框架中的实体类可能包含与 OData 服务定义不同的数据结构。例如,联合主键的实现用于 OData 查询较为麻烦,可以配置 EDM 使得 OData 对外服务不使用联合主键。EDM 配置

在配置 OData 时,我们需要在代码中提供 EDM 对象。

.AddRouteComponents(AuthorizeHelper.PREFIX, EdmHelper.GetEdmModels());

GetEdmModels函数返回一个 IEdmModel对象。

public static IEdmModel GetEdmModels()        {            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();            var device = builder.EntitySet("DeviceInfos").EntityType.HasKey(p => p.DeviceId);device.Action("Upload");            builder.EnableLowerCamelCase();            return builder.GetEdmModel();        }

以上代码中对 DeviceInfo 类型定义了一个实体对象,其具有 DeviceId作为主键,拥有一个名为 Upload的 Action。并且对所有的 EDM 对象启用了 LowerCamelCase 支持。上面的感觉是挺简单的是吧,注意我们使用到了 ODataConventionModelBuilder对象,这个对象帮助我们自动实现了很多配置内容。如果我们使用其他的方式就不那么简单了。实际上配置 EDM 总共有三种方式。

我一般只使用 Convention 的配置方法,因此这里引用官方网站的例子,详情请见 Introduction to the model builders - OData | Microsoft Learn

Explicit

如果模型通过 new EdmModel()构建,那么构建的是无类型模型,相当于你不依赖现有的 CLR 类型凭空构建了一个模型。

public IEdmModel GetEdmModel(){    EdmModel model = new EdmModel();    EdmEntityType customer = new EdmEntityType("WebApiDocNS", "Customer");customer.AddKeys(customer.AddStructuralProperty("CustomerId", EdmPrimitiveTypeKind.Int32));customer.AddStructuralProperty("Location", new EdmComplexTypeReference(address, isNullable: true));model.AddElement(customer);EdmEntityType order = new EdmEntityType("WebApiDocNS", "Order");order.AddKeys(order.AddStructuralProperty("OrderId", EdmPrimitiveTypeKind.Int32));order.AddStructuralProperty("Token", EdmPrimitiveTypeKind.Guid);model.AddElement(order);    return model;}
Non-convention

如果模型是依赖 new ODataModelBuilder()构建,那么构建模型时可以依据现有的 CLR 对象进行构建,不过依然需要配置每一个属性、操作等。

public static IEdmModel GetEdmModel(){    var builder = new ODataModelBuilder();    var customer = builder.EntityType();customer.HasKey(c => c.CustomerId);customer.ComplexProperty(c => c.Location);customer.HasMany(c => c.Orders);var order = builder.EntityType();order.HasKey(o => o.OrderId);order.Property(o => o.Token);    return builder.GetEdmModel();}

相当于前一种方法已经有了很大改进,我们可以依赖现有的结构,而不再需要手动去命名了。

Convention

更进一步,我们可以使用惯例 ( Convention )方式,模型依赖 new ODataConventionModelBuilder ()构建,这个是代码最少的,整个模型的配置按照 OData RESTful 惯例实现。

public static IEdmModel GetEdmModels()        {            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();            var device = builder.EntitySet("DeviceInfos").EntityType;            return builder.GetEdmModel();        }

Convention 涉及的内容很多,有机会以后会详细解释惯例生成 EDM 这种模式。

常用 EDM 配置

EDM 配置项目繁多,我们常用的有:

配置实体(主键)
var device = builder.EntitySet("DeviceInfos").EntityType;
配置(集合) Action
//对于实体上的Actiondevice.Action("Upload");//对于集合上的Actiondevice.Collection.Action("Upload");
配置(集合) Function
//对于实体上的Functiondevice.Function("Data").Returns();//对于集合上的Functiondevice.Collection.Function("Data").Returns();

对 Function 以及 Action 的详细介绍,请期待后续文章。

访问 EDM 模型

OData 服务提供了 $metadata终结点,可以从服务的根 URL 后添加 $metadata来访问。例如以下是一个可以直接访问的 EDM 模型,以 XML 形式提供:

http://services.odata.org/TripPinRESTierService/$metadata

此外,也可以使用某些工具(如 Microsoft 的 OData Connected Service)来自动生成客户端代码,并从服务中获取元数据。这些工具通常会从服务的根 URL 下载 $metadata 文件,并将其解析为客户端代码。

标签:

相关阅读

六代中医传人张喜海:守正中医创新治骨...

张医生,我们是专门过来找您看病的张院长,你看看我的病还能治吗?治骨病,找张喜海医生 纷杂的诊室...

2019-12-17 更新

庆70华诞 迎民族盛会——新阶层 新担...

拼搏砥砺七十载,大展宏图喜露颜。7月26日,由中华网河南频道主办,河南省委统战部新的社会阶层人士统战工作处...

2019-07-28 更新

河南首家无人机表演编队亮相 夜空中上...

【导语】河南地图、少林功夫、司母戊鼎、甲骨文、卢舍那大佛、鲸鱼、金字塔、雪花……200架无人机编队在夜空中...

2019-07-15 更新

OData WebAPI实践-OData与EDM

本文属于OData系列引言在OData中,EDM(EntityDataModel)代表“实体数据模型”,它是一种用于表示WebAPI中

2023-05-11 更新

如何通过股票成交量判断主力意图?股票...

如何通过股票成交量判断主力意图?股票成交量是指在一段时间内成交的股票数量,通俗地说就是股票在某个时间段内...

2023-05-11 更新

放量跌停预示着什么?放量跌停和缩量跌...

放量跌停预示着什么?放量跌停是否意味着什么,要根据跌停的原因来分析:1、如果股价在高位放量跌停,通常是因...

2023-05-11 更新

热门看点:集齐“三个首次”的它有多厉...

作为空间站应用与发展阶段迎来的首艘飞船,它不仅拥有多个“首次”,同时也进行了扩容与改造升级,从而更好

2023-05-11 更新

环球微头条丨收购伊莱克斯?美的集团称...

近年,中国家电巨头在海外发达国家市场进行收购并不少见,像海尔智家(600690 SZ)2016年收购了美国GE家电

2023-05-11 更新

南拳妈妈女主唱下雨天_南拳妈妈女主唱-...

1、英文名:Lara  本名:梁心颐  生日:5月2日  星座:金牛座  血型:B  最喜欢的音乐:另类摇滚

2023-05-11 更新

推动数字赋能 辽宁评定首批省级智慧旅...

推动数字赋能辽宁评定首批省级智慧旅游景区

2023-05-11 更新

什么是宿主软件?宿主软件有哪些?

什么是宿主软件?宿主软件就是专业的音乐制作软件,我们日常听到的大多数正规音乐作品都是用宿主软件制作出来的...

2023-05-11 更新

720p的分辨率是多少像素?720p和1080p看...

720p的分辨率是多少像素?720p的分辨率是921600像素,即大约92万像素;720p表示有效显示格式为1280*720,分辨率...

2023-05-11 更新

华硕电脑N系列好不好?华硕笔记本分几个...

华硕电脑N系列好不好?当然好啊!华硕n系列是高端机,各方面均比低端的a和k系列好的多,n系列最近出的(n43xi241s...

2023-05-11 更新

一台电脑一个小时耗多少电?电脑功率怎...

一台电脑一个小时耗多少电?电脑的实际功耗大多在200W左右,一度电是1Kw h,那么电脑一小时的耗电就是:200&di...

2023-05-11 更新

如何在BIOS中投入使用硬盘静音?BIOS怎...

如何在BIOS中投入使用硬盘静音?1、首先重启电脑,进入bios设置。2、进入后,找到SATA选项,将硬盘模式改为IDE3...

2023-05-11 更新

诺基亚E63用的什么操作系统?诺基亚e63...

诺基亚E63用的什么操作系统?诺基亚E63采用了Symbian 9 2 S60 3 1操作系统。Symbian系统是塞班公司为手机...

2023-05-11 更新

硬盘功耗一般是什么?固态硬盘与机械硬...

硬盘功耗一般是什么?不同的硬盘,功率不一样。1、普通的家用硬盘,是12W-14W。2、监控硬盘,功率比较低,是8W...

2023-05-11 更新

如何用多普达手机连接电脑无线上网?​...

如何用多普达手机连接电脑无线上网?一、手机设置 1 、手机上网设置(首先要保证手机可上网) 1 ) Internet...

2023-05-11 更新

phpnow卸载方法有哪些?php环境如何卸载干净?

phpnow卸载方法有哪些?解压:解压到任意目录;(不能含有中文!例如 "桌面")安装:运行 Setup cmd 根据向导进...

2023-05-11 更新

三星note2哪年上市的?三星Note2和三星S...

三星note2哪年上市的?Samsung Galaxy Note II是三星电子(Samsung)于2012年8月30日在德国柏林发布的一款手机产品。Samsung Galaxy Note

2023-05-11 更新

五菱龙卡微卡上市,3.8米超大货箱超能装

五菱龙卡将以超大货箱、超强动力、超强承载、更优路权、更高效益及可靠品质等全方位产品优势,成为用户创业

2023-05-11 更新

今日热搜:精准洞察3亿市场需求,街电带...

在中国,电动出行方式已经逐渐成为中国居民的主流生活方式之一,根据相关市场数据显示,我国两轮电动车市场零

2023-05-11 更新

大六座正确打开方式,长途自驾唐DM-p舒...

最关键的,油电加起来它续航超长,这次我们只是途中在服务区用快充充了一次电,全程没有补充燃油就开完了接

2023-05-11 更新

热讯:官方网站——2024年太阳能光伏展会

“第八届国际储能两会”依旧围绕着,“光+储”,“新能源电动汽车”等主题,在光伏企业、分布式能源企业、...

2023-05-11 更新

花7亿元修了5年,钟声重响不到半年,英...

极目新闻记者宋清影据《卫报》报道,当地时间5月10日下午1点左右,英国伦敦的地标建筑“大本钟”又停了。自

2023-05-11 更新

汕湛高速公路榜上有名

近日,广东省档案局发出《广东省重大建设项目档案金册奖2022年度获奖项目公告》。其中,汕(头)湛(江)高

2023-05-11 更新

医疗互助让患病职工有“医”靠,参互对...

2023年度(第5期)内蒙古职工互助医疗保障活动已经启动,在职职工只需每人每年缴纳100元(含自治区总工会补

2023-05-11 更新

电力服务“四同步” 企业发展“加速度...

天津北方网讯:“‘四证’加方案,这样的一条龙服务让我们省时、省心、省力,这样一来项目马上就可以开工建

2023-05-11 更新

当前通讯!*** 次数:888888 已用完请...

1、魔兽世界部落想去潘达利亚的话1,必须角色等级达到852,在奥格瑞玛的任务布告板上可以接到去潘达利亚的

2023-05-11 更新

人造肉对气候影响可能是牛肉的25倍_天天热闻

美国科学家的一项最新分析发现,由培养细胞生产的肉类对气候的影响可能是普通牛肉的25倍。相关研究已经提交

2023-05-11 更新

注意!宠物伤人进入高发期 犬伤门诊患...

注意!宠物伤人进入高发期犬伤门诊患者激增---对此,赵俊建议,一旦被宠物轻微咬伤、抓伤,或出现破损皮肤

2023-05-11 更新

“美丽经济”盛行,上海静安举办第四届...

上海静安供图5月11日,澎湃新闻(www thepaper cn)记者从上海市静安区获悉,2023第四届上海国际美妆节启动

2023-05-11 更新

天风证券:给予长城汽车买入评级_速讯

公司2023年加速新能源转型步伐,哈弗和WEY品牌新能源车型储备较为丰富,将于上半年陆续投放。证券之星数据

2023-05-11 更新

新闻频道

社会

财经频道