#c# #asp.net-mvc-3 #entity-framework-4
#c# #asp.net-mvc-3 #entity-framework-4
Вопрос:
У меня есть таблицы, подобные этой
License
------------
Id
LicenseName
DriversLicense
-------------
Id
LicenseId
DriverId
Drivers
-----------
Id
FirstName
LastName
В таблице лицензий есть 6 позиций, теперь я хочу создать переключатели с Да / Нет для всех параметров лицензии для конкретного драйвера. Какие наилучшие отношения между таблицами? (один-один, один-много, много-много) и как я буду показывать переключатели, используя привязку модели.
Комментарии:
1. Если у вас есть хоть минимальное представление о реляционных базах данных, вы должны знать, какой должна быть связь между этими таблицами. Если у вас нет такого минимального понимания, остановите свою текущую задачу и перейдите к чтению некоторого kickstart для реляционных баз данных, иначе вы просто не сможете завершить свой проект.
2. Да, у меня есть такое понимание. Но не уверен, как отобразить в переключателях для конкретного пользователя
3. Вы должны загрузить все записи из License, которые определяют ваши переключатели. Затем вы должны загрузить пользователя с его драйверами / лицензиями и установить переключатели в правильное значение.
4. Я не понимаю, как отображение переключателей соответствует вопросу о связи между таблицами.
Ответ №1:
Ладислав прав насчет отношений сущностей. Если вы хотите, чтобы это сработало, вам придется удалить поле Id из ассоциативной таблицы. Кроме того, в вашей модели данных у каждого объекта должно быть свойство навигации, ссылающееся на другую коллекцию:
public partial class Driver
{
public int Id { get; set; }
// other properties
[UIHint("Licenses")]
public virtual ICollection<License> Licenses { get; set; }
}
И то же самое для класса Driver. Однако я думаю, что попытка использовать кнопки radion будет работать не очень хорошо. В проекте, над которым я работаю, у нас есть несколько ситуаций такого типа, и мы используем listbox.
Используйте UIHint для коллекции, которую вы хотите, чтобы пользователь выбрал, и создайте частичное представление для хранения списка для этого типа коллекции. Итак, в Licenses.cshtml
— должно быть создано в ~/Views/Shared/EditorTemplates / у вас будет что-то вроде этого:
@inherits System.Web.Mvc.WebViewPage<IList<License>>
@Html.ListBoxFor(x => x,
new MultiSelectList((List<License>)ViewBag.LicenseAll,
"Id",
"LicenseName",
Model))
В вашем контроллере установите ViewBag.LicenseAll
все возможные параметры лицензии. В режиме редактирования драйвера вы просто вызываете:
@Html.EditorFor(m=>m.Licenses)
UIHint, который вы установили для модели, найдет правильный частичный вид и отобразит все параметры лицензии и выберет все те, которые установлены для текущего драйвера.
Я знаю, что этот ответ не дает прямого ответа на ваш вопрос (с использованием переключателей), но, учитывая вашу ситуацию, это то, что я бы рекомендовал.
Ответ №2:
Как я написал в комментарии, вы должны увидеть это немедленно. Если вы просто не прекратите свою работу и не займетесь некоторым обучением.
Это отношение «многие ко многим» между драйверами и лицензией, которое должно быть смоделировано с помощью таблицы соединений в реляционной базе данных (DriversLicence). Отношение «Многие ко многим» из концептуальной абстракции разбито на два отношения «один ко многим» между драйверами и DriversLicence и между лицензией и DriversLicence.
EFv4 способен напрямую работать со «многими ко многим», но не в вашем случае, потому что ваша таблица соединений содержит не только столбцы внешних ключей (LicenceId и DriverID), но и дополнительный столбец (Id). EF может скрыть таблицу соединений, только если вы смоделируете ее с помощью as
DriversLicence
----------------
LicenceId
DriverId
Где оба этих столбца составляют сложный первичный ключ. Если вы оставили столбец Id в таблице, ваша лицензия DriversLicence будет представлена как другой объект.
Комментарии:
1. все еще не понимаю, как отобразить значение переключателя для драйвера?
2. Как отобразить переключатель из таблицы лицензий? @Html.RadioButton(что здесь)?