Использование кода 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, хотя информация о событии была действительной.

В заключение, в отношении один-ко-многим (как выше), как вы создаете новое событие (сторона многих) с календарем (одна сторона)? Я уверен, что это довольно просто, и я что-то упускаю, но любая и вся помощь будет оцененный.

/****************/

Вот еще одна деталь, которая, я надеюсь, внесет ясность в мою проблему.

  1. пользователь выбирает календарь (calendar_id, допустим, это 1).
  2. на странице сведений для этого конкретного календаря есть ссылка на контроллер / действие (CalendarController / CreateEvent) для создания нового события, связанного с этим конкретным календарем. То созданный маршрут-Calendar / CreateEvent/1 (Создайте новое событие для календаря с id==1).
  3. в действии 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 3

2 ответа:

Что я обычно делаю, так как я гораздо лучше знаком с тем, как обычно должна выглядеть структура таблиц базы данных, чем то, каким должен быть синтаксис кода EF First, - это настраиваю свои таблицы, а затем использую EF Power Tools для обратного проектирования таблиц в POCOs и сопоставления.

Реверс http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-68-19-metablogapi/3618.ProjectMenu_5F00_thumb_5F00_2E36D883.png

Что касается вашего сущности почему бы просто не добавить свойство 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.

Это решает мою проблему, однако, если у кого-то есть более элегантное решение, Пожалуйста, дайте мне знать.