Должен ли я использовать классы сущности или модели классов в контроллерах? - PullRequest
3 голосов
/ 21 марта 2011

Я новичок в Entity Framework и MVC.
Я пытаюсь понять, что контроллер должен передать в представление.
Должен ли это быть класс из моделей (MySolution.Models.Story) или класс изкаркас сущностей (MySolution.Story).
Проблема в том, что если я выберу одну из каркасов сущностей, то DataTypes и html-помощники будут работать неправильно.Если я выберу класс из моделей, я не смогу преобразовать класс сущности в класс модели, например:

TrendEntities TrendDB = new TrendEntities();
public ActionResult Details(int id) {  
  var Country = TrendDB.Countries.FirstOrDefault(c => c.CountryId ==id);  
  return View(Country);  
}  

Ответы [ 4 ]

2 голосов
/ 21 марта 2011

Просто используйте шаблоны POCO структуры сущности adp.net для генерации.скачать шаблон.щелкните правой кнопкой мыши в конструкторе сущностей, выберите «добавить элемент генерации кода» и выберите шаблон poco.Теперь ваши объекты не имеют с собой весь «багаж рамок сущностей».Прокси автоматически создаются за кулисами, и вам не нужно создавать какие-либо объекты.Вы можете найти этот шаблон, добавив новый элемент в Visual Studio 2010 и выполнив поиск в онлайн-шаблонах из диалогового окна добавления POCO.Имя шаблона:

ADO.NET C # POCO Entity Generator

2 голосов
/ 21 марта 2011

После некоторого расследования я понял, что у меня были проблемы с дизайном.Короче говоря, ПОМНИТЕ, что в MVC 3 нам нужно определить следующий класс в модели

public class StoryDBContext : DbContext
{ 
    public DbSet<Story> Stories {get; set;}
}

А затем в контроллере, который будет использоваться при доступе к Entity Framework.

В предыдущей версии мы не определяли вышеуказанный класс и использовали класс TrendEntities (который был создан платформой) для доступа к БД.Это немного сбивает с толку ... Так, в моем примере TrendDB должен иметь тип StoryDBContext вместо TrendEntities, и все работает как положено.

2 голосов
/ 21 марта 2011

Вы ищете AutoMapper или ValueInjecter .Эти две библиотеки являются преобразователями «объект-объект», которые предназначены для отображения значений из одного объекта в другой.Я раньше использовал только AutoMapper.Это здорово и довольно легко подобрать.Я также слышал много хорошего о ValueInjecter.

0 голосов
/ 21 марта 2011

Используйте ViewModel. Это класс, который, как вы объявляете, имеет свойства, которые вы хотите отобразить в своем представлении.

Например:

var country = TrendDB.Countries.FirstOrDefault(c => c.CountryId == id);

CountryDetails details = new CountryDetails();
details.FirstValueToShow = country.Name;
return View(details);  

Не забывайте строго указывать представление «Подробности» в ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...