EF с Azure - смешивание SQL Server и хранилища Windows Azure - PullRequest
11 голосов
/ 28 сентября 2011

Я хочу использовать два разных источника данных в моем проекте Azure :

  • a SQL Server , который содержит базовую частичную информацию относительно элемента (допускает индексирование данных и пространственный поиск)
  • a Windows Azure Storage , который содержит полную оставшуюся информацию относительно элемента (извлекается по ключу)

Таким образом я могу объединить мощные возможности SQL Server с простой масштабируемостью хранилища Windows Azure .

Представьте себе этот класс POCO домена:

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

Я хотел бы использовать Entity Framework с плавным отображением, чтобы EF понимал, что свойства Изображение и биография должны быть загружены из хранилища Windows Azure (таблица, BLOB-объекты) вместо SQL Server (возможно, загружен Lazy).

Есть ли способ с помощью EF (или NHibernate) сделать это, или я должен реализовать свою собственную стратегию ORM?

Спасибо

Ответы [ 2 ]

6 голосов
/ 15 октября 2011

Вы пытаетесь решить эту проблему слишком рано (в DAL), по моему мнению.Посмотрите в Интернете, он получает большие данные (например, изображения) в отдельном обращении к серверу.Это очень хорошо масштабируется.Данные изображения не включены в сам документ по какой-то причине, они просто все замедляют и не очень устойчивы к сбоям.Если вы объединяете их в одну сущность, вы получаете быстрый поиск сущностей, который замедляется вашим сервером изображений, так как они должны объединиться, прежде чем уйти на уровень вашего бизнеса и, наконец, на уровень представления.И на бизнес-уровне эти данные, вероятно, просто тратят впустую память (поэтому вы хотите лениво загружать их).Поэтому я думаю, что вы принимаете решение слишком рано.То, что вы описываете как свой доменный объект, для меня выглядит как доменный объект уровня представления, похожий на ViewModel.Я не слишком разбираюсь в дизайне, управляемом предметной областью, но, хотя есть общая модель вашего приложения, я предполагаю, что каждая часть вашего приложения потребует немного другой реализации этой модели.

Что касается отложенной загрузки,если у вас это включено и вы пытаетесь отправить свой объект по сети, даже если Picture не был загружен, он будет сериализован, так как сериализатор контракта данных (или любой другой) вызовет get для вашего свойства.

Возможно, это не тот ответ, который вы хотели, но я чувствовал, что должен это сказать.Конечно, я открыт для комментариев и критики.

6 голосов
/ 29 сентября 2011

Я не думаю, что вы можете сообщить EF о хранилище Azure, но вы можете сопоставить только необходимые свойства конкретной таблице. Например,

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

Если предположить, что у вас есть класс репозитория для вашего класса Person, то, чего вы хотите, легко достичь, заполнив класс репозитория API хранилища Azure и EF.

...