2011-09-28 26 views
11

我想在我的Azure項目使用兩個不同的數據源:EF與天青 - 混合SQL Server和Windows Azure存儲

  • 一個的SQL Server包含基本部分信息關於項目(允許可轉位數據和空間搜索)
  • 一個的Windows Azure存儲包含滿剩餘信息有關的項目(通過鍵檢索)

這樣我可以結合強大的SQL Server與Windows Azure存儲的易擴展性。

想象一下這樣的域名POCO類:

class Person 
{ 
    string Id { get; set; } 
    string Name { get; set; } 
    byte[] Picture { get; set; } 
    string Biography { get; set; } 
} 

我想用實體框架用流利的映射,讓EF明白性質圖片和傳記必須從Windows Azure存儲(表,BLOB加載)而不是SQL Server(可能是Lazy loaded)。

有EF(或NHibernate)這樣做的方法,或者我必須實現自己的ORM策略?

感謝

回答

6

我不認爲你可以讓EF瞭解Azure存儲,但你只能必要的屬性到一個特定的表映射。例如,

modelBuilder.Entity<Person>().Ignore(p => p.Picture); 

所以假設你有一個存儲庫類的Person類,你希望可以通過填寫與Azure存儲API和EF庫類可以輕鬆實現什麼。

6

在我看來,您正試圖解決這個問題太早(在DAL)。看看網頁,它會在單獨調用服務器的過程中獲取大量數據(例如圖片)。這已經很好地擴展了。由於某種原因,圖片數據不包含在文檔本身中,它只會減慢一切,並且不會很容錯。如果您將它們放在一個實體中,則您的圖片服務器會減慢快速實體檢索的速度,因爲它們都必須在離開業務層之前走到一起,最後才能進入表示層。而在業務層,這個數據可能只是浪費內存(這就是爲什麼你想延遲加載它)。所以我認爲你做出的決定爲時尚早。你描述的域對象看起來像表示層的域對象,類似於ViewModel。我並沒有太注重領域驅動設計,但是當您的應用程序有一個通用模型時,我認爲應用程序的每個部分都需要該模型的稍微不同的實現。

關於延遲加載,如果啓用了該功能,並且您嘗試通過線路發送對象,即使Picture未加載,它也會被序列化,因爲數據協定序列化程序(或任何其他)會調用get屬性。

這可能不是你想要的答案,但我覺得我不得不這樣說。當然,我很樂意接受評論和批評。