#asp.net-mvc #asp.net-mvc-viewmodel
#asp.net-mvc #asp.net-mvc-viewmodel
Вопрос:
Я работаю над ASP.NET Проект MVC 5, в котором я пытаюсь создать контроллер из модели представления MVC. Эта ViewModel объединяет 6 таблиц, которые мне нужно показать в представлениях. Я понимаю, что использование MVC ViewModels является одним из способов отображения нескольких таблиц в представлении. В любом случае, я получаю следующее сообщение об ошибке:
Error
There was an error running the selected code generator: 'Unable to retrieve metadata for
'PrismSmallTasks.ViewModels.ManageInterviewVM'. One of more validation errors were
detected during model generation:
ManageInterviewVM:: EntityType 'ManageInterviewVM' has no key defined.
Define the key for this EntityType.
ManageInterviewVMs: EntityType: EntitySet 'ManageInterviewsVMs' is based on
type 'ManageInterviewVM' that has no keys defined.
В ManageInterviewVM ViewModel нет ключа. Это потому, что оно состоит из списков таблиц, представленных в моделях, которые находятся в виртуальной машине. И у каждого из этих классов моделей есть столбец, для которого определен ключ.
Например, вот ManageInterviewVM:
public class ManageInterviewVM
{
public List<FieldRecord> FieldRecords { get; set; }
public List<TaskList> TaskLists { get; set; }
public List<InterviewARVTreatment> InterviewARVTreatments { get; set; }
public List<Note> Notes { get; set; }
public List<Risk> Risks { get; set; }
public List<Interview1> Interviews { get; set; }
}
И вот частичный список одной из этих таблиц, как она определена в классе модели:
public partial class TaskList
{
[Key]
public int ID_TaskList { get; set; }
[Required]
[StringLength(15)]
public string CD_TaskListType { get; set; }
public int? ID_Profile { get; set; }
public int? ID_FieldRecord { get; set; }
public int? ID_Interview { get; set; }
Итак, я не знаю, чего мне не хватает. Почему появляется эта ошибка и как я могу ее устранить?
Комментарии:
1. Просто убедитесь, что ваши модели представления находятся в отдельной папке (скажем
ViewModels)
, чтобы они не были связаны с EF.2. Они находятся в отдельной папке.
3. Затем вы делаете что-то еще, что приводит к его добавлению в контекст вашей базы данных
Ответ №1:
Ваши ViewModels должны быть полностью отделены от вашего контекста данных (уровень доступа к данным). Только ваши модели домена должны иметь дело с DAL. ViewModels предназначены только для отображения определенной информации в представлении.
Итак, после создания вашей ViewModel.. вы пытаетесь создать свое представление. Когда вы дойдете до этого экрана:
- Введите имя вашего представления
- Выберите свой шаблон (если вы оставите его как «Пустой (без модели)», тогда вы сможете просто создать его без каких-либо проблем).
- Как только вы выберете определенный шаблон и класс модели (ViewModel), «Класс контекста данных» автоматически заполнится вашей строкой подключения (dbcontext), в чем и заключается ваша проблема.
Поскольку viewmodels не должны быть связаны с уровнем доступа к данным, вы можете просто удалить то, что автоматически заполняется в «классе контекста данных», и тогда вы сможете создать свое представление.
Если вы попадаете в ловушку, думая, что вам нужно определить ключи для вашей viewmodel.. затем ваш класс viewmodel будет добавлен к классу вашей строки подключения (класс dbcontext).. что является нет-нет.
Вам необходимо запросить базу данных, используя ваши модели домена.. затем вы присваиваете эти значения своим свойствам ViewModels, которые вы хотите отобразить.
Надеюсь, это поможет!
Комментарии:
1. Я этого не знал. Класс контекста данных был заполнен производным классом DbContext, когда я выбрал ViewModel в качестве класса модели. Я думал, что так и должно было быть. Собираюсь попробовать без этого производного класса DbContext.
2. Я думаю, что это ответ. Сейчас я просто борюсь с маршрутизацией, чтобы исправить это.
3. @Rod в чем проблема с маршрутизацией?