DbContext/ObjectContext,宣告式設定存取規則,自動處理查詢/更新,適合「以資料模型為中心、需快速公開 CRUD」場景。Matt Milner 語錄:「WCF Data Services 適合從資料/模型出發直接公開;Web API 適合從 API 設計出發、決定要公開什麼。」
EntityFramework NuGet 套件(含 System.Data.Entity.dll)。AirlineContext、Airline、FlightLeg 等)。AirlineController。產生的 Controller 繼承 ApiController,含 GetAirlines、GetAirline(id)、Put/Post/Delete 等動作,回傳 XML/JSON 視 Client Accept 標頭而定。

EntitySetController<TEntity, TKey>(需安裝 Microsoft.AspNet.WebApi.OData NuGet)。WebApiConfig.Register 以 ODataConventionModelBuilder 宣告 EntitySet。config.Routes.MapODataRoute。AirlinesController)符合 OData 慣例。public class AirlinesController : EntitySetController<Airline, int> {
private AirlineContext db = new AirlineContext();
[Queryable] // 啟用 $filter, $orderby 等
public override IQueryable<Airline> Get() => db.Airlines;
// 可選覆寫:GetEntityByKey, CreateEntity, UpdateEntity, PatchEntity, DeleteEntity, CreateLink, DeleteLink
}
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Airline>("Airlines");
builder.EntitySet<FlightLeg>("Legs");
var model = builder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "oairlinedata", model);
}
}
GET /oairlinedata/ → 列出 Airlines、Legs 集合。GET /oairlinedata/Airlines → JSON 陣列(含 odata.metadata)。GET /oairlinedata/Airlines(3)。[Queryable]):$filter=startswith(Name,'Vermont')、$top、$orderby 等。回傳範例:
{
"odata.metadata":"https://localhost:1702/oairlinedata/$metadata#Airlines",
"value":[
{"Id":1,"Name":"Vermont Balloons","ModifiedDate":"2013-02-26T00:00:00"},
{"Id":2,"Name":"Olympic Airways","ModifiedDate":"2013-02-26T00:00:00"},
{"Id":3,"Name":"Salt Lake Flyer","ModifiedDate":"2013-02-26T00:00:00"}
]
}
[Queryable(MaxTop=100)] 等屬性防止濫用。參考 OData 安全指南。CreateLink/DeleteLink 處理關聯。