SilverLight 4, .Net Ria Services и связь many to many
Начав работать с SilverLight 4 и. Net Ria Services, одной из первых проблем с которой я столкнулся это была проблема организации связи many to many. На серверном уровне все было ОК. Генератор Entity Framework (EF) создал связь many to many, и отображал его в окне Model Browser без проблем. Но почему то на клиентскую сторону (SilverLight) данные не передавались. После поиска в google я наткнулся вот на такой вывод по поддержке связи many to many в .Net Ria Services: "RIA Services does not support the many to many relationship directly". Так как организовать связь many to many в. Net Ria Services? А все просто, нам необходимо заменить одину связь many to many двумя one to many связями. Давайте перйдем к конкретному примеру. Для начала создайте базу данных с следующей структурой: Как видно из рисунка между таблицами Roles и Users есть классическая many to many связь. Поле Note в таблице UsersRoles было добавлено для того чтобы генератор EF сгенерировал три класса: Users, Roles и UsersRles (обход проблемы many to many в .Net Ria Services) с связями one to many. Если забрать это поле то генератор EF создаст только два класса (Roles и Users) с связю many to many, что нам совсем не нужно (как я уже говорил выше. Net Ria Services не поддерживает напрямую связь many to many). Далее создадим новый проект Silver Light Business Application (я назвал его NRSBusinesApp. В Solution Explorer в проекте NRSBusinesApp.Web кликаем правой кнопкой мыши по папке Models и из контекстного меню выбираем пункт "Add - > New Item ...". В окне что появилось, выберите Installed Templates - > Data - > ADO. NET Entity Data Model, переименуйте с Model1.edmx на ModelNRS.edmx и нажмите Add. В окне что появилось выберите "Generate from database" и нажмите "Next >, теперь перед вами должено появиться окно создания соеднение к вашей базы данных, если у вас еще нет созданного коннекта то создайте его как показано ниже на рисунке: После создания соеднение, жмем "Next >", в результате у нас появится окно "Entity Data Model Wizard", в котором мы должны выбрать таблицы из которых будут созданы наши бизнес объекты, и нажать "Finish": После всех этих манипуляций у вас должна быть приблизительно такая модель данных: Далее Перестройте проект (Build - > Rebuild Solution) Теперь нам нужно создать уровень доступа к нашей модели данных. Для этого в Solution Explorer в проекте NRSBusinesApp.Web кликаем правой кнопкой мыши по папке Services и из контекстного меню выбираем пункт "Add - > New Item ...". В окне что появилось, выберите Installed Templates - > Web-> Domain Service Class, переименуйте с DomainService1.cs на NRSDomainService.cs и нажмите Add. В окне Add New Domain Service Class отмечаем галочками записи в столбцах Entities и Enable Editing и нажмите OK, как показано на рисунке: Откройте файл NSRDomainService.metadata.cs. Найдите в нем класс "internal sealed class UsersMetadata" и над полем "UsersRoles" добавьте атрибут [Include]: Перестройте проект. Теперь у вас все готово чтобы передать информацию о пользователях и их ролях на уровень SilverLight клиента. Откройте Home.xaml в SilverLight проекте NRSBusinesApp (Views - > Home.xaml. Из окна Data Sources перетащите Users и Users Roles на страницу Home.xaml. Добавьте в базу данных несколько ролей пользователей и связей между ними. Запустите проект. У вас должно получиться нечто подобное: Теперь нам нужно поработать над отражением ролей пользователя (чтобы отображались только роли выбранного пользователя. Для этого перейдем на Home.xaml, найдем объект usersDataGrid и добавим к нему обработчик событий "SelectionChanged. В обработчике событий добавьте следующий код: В xmal коде измените userRolesDataGrid так как показано ниже: Перекомпилюйте и запустите проект. У меня получился вот такой результат: Автор: Виктор Миронович |













