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) з звязками 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. В вікні що появилось вибthsnm "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 так як показано нижче: Перекомпілюйте та запустіть проект. У мене вийшов ось такий результат: Автор: Віктор Миронович |













