Используя MVC 3 Entity Framework Code-First, как вы создаете новый объект «многие» в отношении «один ко многим»? - PullRequest
3 голосов
/ 09 августа 2011

Я уверен, что это очень просто, однако, прочесывая сеть, я не могу найти ничего, что могло бы мне помочь.

Я использую ASP.NET MVC 3 с моделированием Entity Framework Code-first.

У меня есть простая связь один-ко-многим между Календарем и Событием (для каждого календаря может быть 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

Я создал страницу со ссылкой «Создать новое событие», которая передает идентификатор календаря в действие CalendarController с именем «Создать» (/ localhost: xxxxx / Calendar / Create / 1).

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

Я попытался создать ViewModel, объединяющий идентификатор календаря и объект Event, однако, когда я возвращаюсь из Create.cshtml, идентификатор календаря был сброшен с 1 до 0, хотя информация о событии была действительной.

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

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

Вот немного больше деталей, которые, я надеюсь, добавят разъяснения к моей проблеме.

  1. Пользователь выбирает календарь (calendar_id, скажем, 1).
  2. На странице сведений для этого конкретного календаря есть ссылка на контроллер / действие (CalendarController / CreateEvent) для создания нового события, связанного с этим конкретным календарем. Созданный маршрут - Calendar / CreateEvent / 1 (создайте новое событие для календаря с id == 1).
  3. В действии CreateEvent у меня теперь есть идентификатор для экземпляра календаря для нового события.

Здесь я запутался ...

Объект Event не имеет члена данных calendar_id, так как он создан механизмом первого кода, поэтому мне нечего присвоить calendar_id, который поступил в данные маршрута.

Я знаю, что это стандартная ситуация, но я что-то упускаю. Мне нужно сохранить calendar_id до [HttpPost] CreateEvent. Оттуда я могу просто найти подходящий календарь (используя calendar_id), взять информацию из новой формы события (в CreateEvent.cshtml), чтобы создать новое событие, и просто вызвать Calendar.Add (newEvent).

Как мне сохранить calendar_id (или календарь в этом отношении) в течение всего цикла GET / form / POST?

Еще раз спасибо за любую помощь.

/ ************* *** / Я перепробовал возможное решение, упомянутое ниже, чтобы добавить виртуальный Calendar и CalendarId в класс Event. Я изменил принятый параметр действия на объект Event для функций HttpGet и HttpPost. В функции HttpGet я установил для CalendarId значение календаря, в которое будет добавлено новое событие (как указано выше, id == 1). В представлении CreateEvent все работало нормально, однако при возврате к действию HttpPost CreateEvent для CalendarId было установлено значение 0.

Я все еще что-то упускаю ... но спасибо за помощь, и я все еще ищу эту искру.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Потратив некоторое время на переосмысление своей проблемы и еще немного исследований, я нашел следующую информацию и решение.

Во-первых, очень хороший учебник (немного длинный, но с хорошей детализацией)доступно по адресу: http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

Это руководство не рассматривает и не использует Ioc, однако концепции, касающиеся структуры сущностей и первых идей кода, очень полезны.

Что касается моегоРешением я сделал две вещи: 1. В соответствии с приведенным выше уроком, я добавил два поля в свой класс Event.Я добавил свойства "long timeline_id" и "virtual calendar calendar".Это дает мне место для хранения timeline_id, переданного в действие контроллера CreateEvent.А свойство виртуального календаря обеспечивает свойство навигации обратно к таблице календаря.2. Я решил использовать скрытое поле в форме cshtml CreateCalendar для создания нового события.Это позволяет хранить timeline_id в форме и затем возвращать его в экземпляр HttpPost действия CreateEvent.

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

2 голосов
/ 10 августа 2011

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

Reverse 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...