本篇目錄
介紹###
OData在其官網的定義是:
允許以一種 簡單且標准的方式創建和使用可查詢的、可互操作的RESTful APIs。
在ABP中也可以使用OData。Abp.Web.Api.OData nuget包簡化了它的使用。
安裝###
安裝Nuget包
我們應該首先將Abp.Web.Api.OData nuget包安裝到WebApi項目中:
Install-Package Abp.Web.Api.OData
設置模塊依賴
給我們的WebApi項目設置的模塊設置AbpWebApiODataModule的依賴。例如:
[DependsOn(typeof(AbpWebApiODataModule))]
public class MyProjectWebApiModule : AbpModule
{
...
}
請查看模塊系統來理解模塊依賴。
配置實體類
OData要求聲明那些可以用作OData資源的實體。我們應該在WebApi項目模塊的PreInitialize方法中處理這件事,如下所示:
[DependsOn(typeof(AbpWebApiODataModule))]
public class MyProjectWebApiModule : AbpModule
{
public override void PreInitialize()
{
var builder = Configuration.Modules.AbpWebApiOData().ODataModelBuilder;
//Configure your entities here...
builder.EntitySet<Person>("People");
}
...
}
這里,我們得到了ODataModelBuilder的引用並設置了Person實體。類似地,你可以使用EntitySet來添加其他的實體。這里格外需要注意的是,括號里面的字符串People是指的控制器的前綴,這里我的控制器是PeopleController,當然你也可以設置為Persons等,我這里只是想說明要填的字符串更數據庫的表名和自己定義的實體名沒有關系。
查看使用ASP.NET Web API 2創建OData v4 終結點獲取更多關於builder的信息。
創建控制器###
Abp.Web.Api.OData nuget包 包括了AbpODataEntityController基類(它擴展了標准的ODataController),這樣就可以更容易地創建控制器了。下面是一個為Person實體創建一個OData終端(endpoint)的例子:
public class PersonsController : AbpODataEntityController<Person>
{
public PersonsController(IRepository<Person> repository)
: base(repository)
{
}
}
就是這么簡單,AbpODataEntityController的所有方法都是virtual聲明的。這意味着你可以重寫 ** Get, Post, Put, Patch, Delete**和其他的action方法以及添加自己的邏輯。
例子###
下面看一個例子:
我的應用的端口是:localhost:61759。這里我只演示一些基本的東西,因為OData是一個標准的協議,所以你可以在網上輕松地找到更高級的例子。
數據庫中People表的數據如下圖:
獲取實體列表
這里我來獲取所有的Person:
獲取單個實體
獲取Id=2的那個Person的數據:
獲取具有導航屬性的單個實體
修改實體類的定義,重新定義如下:
Person實體的定義:
namespace ABPMVCTest.Entities
{
[Table("Persons")]
public class Person:Entity
{
public virtual string Name { get; set; }
public virtual bool Gender { get; set; }
public virtual string UserName { get; set; }
public virtual ICollection<Car> Cars { get; set; }
public Person()
{
}
public Person(string name, params Car[] cars)
{
Name = name;
if (cars!=null)
{
Cars=new Collection<Car>();
foreach (var car in cars)
{
car.Person = this;
Cars.Add(car);
}
}
}
}
}
Car實體的定義:
namespace ABPMVCTest.Entities
{
[Table("Cars")]
public class Car:Entity
{
public virtual Person Person{ get; set; }
public virtual int PersonId { get; set; }
public virtual CarBrand Brand { get; set; }
public virtual int Price{ get; set; }
public Car()
{
}
public Car(CarBrand brand, int price)
{
Brand = brand;
Price = price;
}
}
}
CarBrand(汽車品牌)實體的定義:
namespace ABPMVCTest.Entities
{
public enum CarBrand
{
Jeep,
Buick,
Lincoln,
Kia,
LandRover
}
}
修改實體類之后,接下來給數據庫填充數據。新增了3個人,Id分別是7,6,9;在Car表中分別給這三個人分配了汽車,如下圖:
比如獲取小明(Id=7)的數據,它具有一個Car導航屬性,該屬性代表此人的汽車對象:
查詢
下面將數據庫的數據進行修改,如下圖:
Persons表的數據:
Cars表的數據:
這里演示一個更高級的查詢,包括過濾,排序和獲取前2個結果,借助postman來演示:
查詢條件是:Id<4,OrderBy UserName Desc,取前兩條數據
請求
http://localhost:61759/odata/People?$filter=Id lt 4&$orderby=UserName&$top=2
響應
可以看到,只過濾出來了小紅和小剛的數據。
OData支持分頁,排序,過濾,投影以及更多。
請查看官方文檔獲取更多信息。
創建一個新實體
在這個例子中,我們將創建一個新的Person,借助postman,很容易發送一個post請求。
請求
注意這里的報文頭為Content-Type:"application/json"
響應
去數據庫查看一下,發現已經多了一條剛才post的數據:
當然了,我們也可以更新和刪除實體,這里就不再做演示了,大家自行練習。
獲取元數據【MetaData】
我們還可以獲得實體的元數據,如下所示:
請求
http://localhost:61759/odata/$metadata
響應
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="ABPMVCTest.Entities" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="Person">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Name" Type="Edm.String" />
<Property Name="Gender" Type="Edm.Boolean" Nullable="false" />
<Property Name="UserName" Type="Edm.String" />
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="Cars" Type="Collection(ABPMVCTest.Entities.Car)" />
</EntityType>
<EntityType Name="Car">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="PersonId" Type="Edm.Int32" />
<Property Name="Brand" Type="ABPMVCTest.Entities.CarBrand" Nullable="false" />
<Property Name="Price" Type="Edm.Int32" Nullable="false" />
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="Person" Type="ABPMVCTest.Entities.Person">
<ReferentialConstraint Property="PersonId" ReferencedProperty="Id" />
</NavigationProperty>
</EntityType>
<EnumType Name="CarBrand">
<Member Name="Jeep" Value="0" />
<Member Name="Buick" Value="1" />
<Member Name="Lincoln" Value="2" />
<Member Name="Kia" Value="3" />
<Member Name="LandRover" Value="4" />
</EnumType>
</Schema>
<Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityContainer Name="Container">
<EntitySet Name="People" EntityType="ABPMVCTest.Entities.Person" />
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
樣例項目###
你可以在Github上獲得樣例代碼,點擊查看