2012-07-18 54 views
1

我有一組我希望通過存儲庫模式持久存在的實體。在Azure和SQL存儲庫之間共享模型

香草SQL是相當直接的,寫一些方法有采取/返回實體的查詢。

Azure的表存儲也是相當直接的,但最讓我看到了實現的希望實體從一些常見的Azure的基類後裔居住。 (TableServiceEntity等)

EF工作爲好,但也希望給自己多一點的實體。

有抽象掉的好方法無論是SQL Azure的並表的東西,這樣的實體可以堅持無論哪種方式?

雙向的支持是不是真的需要,我們只是將不得不需要支持兩種不同的部署類型。

我想這些模型來儘可能他們正在堅持的存儲庫作爲不可知,以儘可能少的依賴關係(沒有?)如果可能的話。

+0

我想什麼避免是我們目前所在的地方:我們有一些不可知論的模型和實現特定的模型,a nd他們知道如何構建彼此,但這是一個巨大的PITA – 2012-07-18 20:52:30

+0

我們開始使用ValueInjecter和Automapper在模型之間進行切換,這大大減少了問題,但我仍然不喜歡整體概念。 – 2012-08-08 15:42:31

回答

2

這是可行的。我已經幫助建立了一個規模很大的客戶端。

1)不要從TableServiceEntity繼承,而是落實在你的實體以下屬性:

[DataServiceKey(new string[] { "PartitionKey", "RowKey" }), Serializable] 

此外,實施某種在你的實體,它提供PartitionKey,RowKey和時間戳到您的實體的接口。

public interface ITableEntity 
{ 
    string PartitionKey { get; set; } 
    string RowKey { get; set; } 
    DateTime Timestamp { get; set; } 
} 

至少這種方法可以讓你擁有自己的繼承策略爲自己的實體,而不是因缺乏多繼承的限制。試着讓PartitionKey和RowKey提供一個傳遞給真正的密鑰屬性,而不是複製密鑰。

public string PartitionKey 
{ 
     get 
     { 
      return this.Id; 
     } 
     set 
     { 
     this.Id = value; 
     } 
} 

2)意識到您的系統中會有兩種類型的存儲庫:關係特定和特定於ATS的存儲庫。

3)您可以通過EDMX生成你的實體和使用部分類與ITableEntity和DataServiceKey屬性

4)注入他們在某些時候,你會需要你的ATS專用倉庫做你的實體的一些轉換爲持久性的緣故,因爲你將數據保存到ATS的方式是不一樣,你會想在你的域模型(這尤其涉及到分層或關係數據)

HTH