Использование кода MVC 3 Entity Framework-во-первых, как создать новый объект "многие" в соотношении один ко многим?
Я уверен, что это очень прямолинейно, однако, после того, как я прочесал сеть, я не могу найти ничего, что помогло бы мне выпрямиться.
Я использую ASP.NET MVC 3 с кодом Entity Framework-первое моделирование.
У меня есть простое отношение "один ко многим" между календарем и событием (для каждого календаря может быть 0 или более событий). Проще говоря, я не знаю, как создать/вставить новое событие, связанное с календарем.Определения домена моей сущности являются:
public class Calendar
{
[Key]
public long id { get; set; }
public string title { get; set; }
public string description { get; set; }
public virtual ICollection<Event> events { get; set; }
} //class
public class Event
{
[Key]
public long id { get; set; }
public string title { get; set; }
public string description { get; set; }
public DateTime startdate { get; set; }
public DateTime enddate { get; set; }
public int importance { get; set; }
} //class
Я создал страницу со ссылкой на "Create a new event", которая передает идентификатор календаря действию CalendarController с именем Create (/localhost:xxxxx/Calendar/Create/1).
Я застрял на этом этапе, как и с кодом-во-первых, у меня нет calendar_id (или чего-то подобного) в качестве указанного члена класса событий, чтобы связать событие с календарем. Это действительно существует в базе данных, поскольку столбец был сгенерирован механизмом Code-first.
Я пробовал создавать однако, когда я возвращаюсь из Create, ViewModel объединяет идентификатор календаря и объект события.cshtml идентификатор календаря был сброшен с 1 до 0, хотя информация о событии была действительной.
В заключение, в отношении один-ко-многим (как выше), как вы создаете новое событие (сторона многих) с календарем (одна сторона)? Я уверен, что это довольно просто, и я что-то упускаю, но любая и вся помощь будет оцененный.
/****************/
Вот еще одна деталь, которая, я надеюсь, внесет ясность в мою проблему.
- пользователь выбирает календарь (calendar_id, допустим, это 1).
- на странице сведений для этого конкретного календаря есть ссылка на контроллер / действие (CalendarController / CreateEvent) для создания нового события, связанного с этим конкретным календарем. То созданный маршрут-Calendar / CreateEvent/1 (Создайте новое событие для календаря с id==1).
- в действии CreateEvent теперь у меня есть идентификатор экземпляра календаря для нового события.
Объект Event не имеет элемента данных calendar_id, поскольку он создается механизмом Code-first, поэтому мне нечего назначить calendar_id, который прибыл в данные маршрута.
Я знаю, что это стандартная ситуация, но я упускаю что-то. Мне нужно сохранить calendar_id до [HttpPost]CreateEvent. Оттуда я могу просто найти нужный календарь (используя calendar_id), взять информацию из новой формы события (в CreateEvent.cshtml), чтобы создать новое событие,и просто вызвать календарь.Добавить (newEvent).
Как сохранить calendar_id (или календарь, если на то пошло) на протяжении всего цикла GET/form/POST?
Еще раз спасибо за любые помощь.
/****************/ Я перепробовал возможное решение, упомянутое ниже, чтобы добавить виртуальный календарь и CalendarId в класс событий. Я изменил принятый параметр action на объект события для функций HttpGet и HttpPost. В функции HttpGet я устанавливаю CalendarId для календаря, в который будет добавлено новое событие (как и выше,id == 1). Все работало отлично в городе. Вид CreateEvent, однако, о возврате к протоколы HttpPost действий CreateEvent, в CalendarId был сброшен до 0.
Я все еще чего-то не понимаю... но спасибо за помощь,и я все еще ищу эту искру.2 ответа:
Что я обычно делаю, так как я гораздо лучше знаком с тем, как обычно должна выглядеть структура таблиц базы данных, чем то, каким должен быть синтаксис кода EF First, - это настраиваю свои таблицы, а затем использую EF Power Tools для обратного проектирования таблиц в POCOs и сопоставления.
Что касается вашего сущности почему бы просто не добавить свойство
Calendar
к вашему классуEvent
public class Event { [Key] public long id { get; set; } public string title { get; set; } public string description { get; set; } public DateTime startdate { get; set; } public DateTime enddate { get; set; } public int importance { get; set; } public virtual Calendar Calendar { get; set; } public int CalendarId { get; set; } } //class
После некоторого времени, чтобы переосмыслить свою проблему и сделать немного больше исследований, я нашел следующую информацию и решение.
Во-первых, очень хороший учебник (немного длинный, но много хороших деталей) доступен по адресу: http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application
Этот учебник не вникает, не использует и МОК, однако понятия, касающиеся entity framework и code first ideas, очень важны. полезный.
Что касается моего решения, я сделал две вещи: 1. В соответствии с вышеприведенным руководством я добавил два поля в свой класс событий. Я добавил свойства" long timeline_id "и" virtual Calendar calendar". Это дает мне место для хранения timeline_id, переданного в действие контроллера CreateEvent. А виртуальная собственность календаря содержит свойство навигации обратно на настольный календарь. 2. Я решил использовать скрытое поле в форме CreateCalendar cshtml для создания нового события. Это позволяет timeline_id, который будет сохранен в форме и затем возвращен в экземпляр HttpPost действия CreateEvent.
Это решает мою проблему, однако, если у кого-то есть более элегантное решение, Пожалуйста, дайте мне знать.