Получение EntityType не имеет определенной ключевой ошибки при попытке создать представление из MVC ViewModel

#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.. вы пытаетесь создать свое представление. Когда вы дойдете до этого экрана:

Создание представления

  1. Введите имя вашего представления
  2. Выберите свой шаблон (если вы оставите его как «Пустой (без модели)», тогда вы сможете просто создать его без каких-либо проблем).
  3. Как только вы выберете определенный шаблон и класс модели (ViewModel), «Класс контекста данных» автоматически заполнится вашей строкой подключения (dbcontext), в чем и заключается ваша проблема.

Поскольку viewmodels не должны быть связаны с уровнем доступа к данным, вы можете просто удалить то, что автоматически заполняется в «классе контекста данных», и тогда вы сможете создать свое представление.

Если вы попадаете в ловушку, думая, что вам нужно определить ключи для вашей viewmodel.. затем ваш класс viewmodel будет добавлен к классу вашей строки подключения (класс dbcontext).. что является нет-нет.

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

Надеюсь, это поможет!

Комментарии:

1. Я этого не знал. Класс контекста данных был заполнен производным классом DbContext, когда я выбрал ViewModel в качестве класса модели. Я думал, что так и должно было быть. Собираюсь попробовать без этого производного класса DbContext.

2. Я думаю, что это ответ. Сейчас я просто борюсь с маршрутизацией, чтобы исправить это.

3. @Rod в чем проблема с маршрутизацией?