OData (Open Data Protocol) 基於 HTTP、Atom、AtomPub、EDM,提供統一資料存取介面。WCF Data Services 讓 .NET 類型/資料庫輕鬆公開為 OData 端點。本文示範如何將 OData 映射為標準 AtomPub,支援 Windows Live Writer 等部落格工具。
MyBlogDB.edmx),模型優先設計 Post 實體
屬性:Id(PK)、Title、PublishDate(Nullable)、Content。
設計器右鍵「根據模型產生資料庫」→ 產生 SQL → 執行建立 MyBlogDB。
CREATE TABLE [dbo].[Posts] (
[Id] int IDENTITY(1,1) NOT NULL,
[Title] nvarchar(max) NOT NULL,
[PublishDate] datetime NULL,
[Content] nvarchar(max) NOT NULL
);

public class HomeController : Controller
{
MyBlogDBContainer blogDB = new MyBlogDBContainer();
public ActionResult Index() => View(blogDB.Posts);
}
View 以 foreach 顯示 Title、Content、PublishDate。

odata.svc)DataService<MyBlogDBContainer>,SetEntitySetAccessRule("*", All)
public class odata : DataService<MyBlogDBContainer>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
/odata.svc → 列出 Posts 集合/odata.svc/Posts → Atom 格式,content/properties 含 OData 中繼資料
IE 等 Atom 閱讀器無法正確顯示 Title/Content,因 OData 將資料放在 m:properties 而非標準 title/content 元素。

m:properties/Title → atom:titlem:properties/Content → atom:content type="html"m:properties/PublishDate → atom:published
[ODataBloggingServiceBehavior(typeof(MyBlogDBContainer))]
[EntityAtomMapping("Posts", "PublishDate", "published")]
public class atompub : DataService<MyBlogDBContainer> { ... }
ODataBloggingServiceBehavior:注入訊息處理管線進行 XML 轉換EntityAtomMapping:指定實體集合、來源屬性、目標 Atom 屬性https://server:port/atompub.svc即可使用 WLW 豐富編輯器管理文章。

文末附完整範例程式碼 (ODataBlogging.cs 核心實作)。