ASP.NET MVC 3 нескольких моделей в одну форму с использованием БД - PullRequest
0 голосов
/ 20 марта 2012

У меня есть вопрос.

Мой вопрос фактически расширяется от this one:

Коротко - что я хочу получить: 3 модели и 1 супер модель дляэто конкретный взгляд.Эта супер модель заполняет (правильно) IENumerable, IENumerable, IENumerable, чтобы использовать их в части View.(насколько я понимаю, по крайней мере ...)

В этой другой теме Дэн Ревелл предложил очень милое и элегантное решение, но это решение не извлекает данные из самой БД ...

Вопрос: Что нужно сделать, чтобы получить данные в этой модели из БД, а не из «новых» конструкторов экземпляров?

При использовании этого подхода пытались извлечь данные из DBContext.И у меня возникли некоторые проблемы) Я не могу понять, когда (или как) создать мой DBContext ... Или как получить доступ к тому, что создано приложением ...

Попытка принудительно создать его в Controller, как

using (var Db = new thetaskermvc.Models.TaskerDBContext())
    {
        var themodel = new thetaskermvc.Models.TotalView();
        //Jobbers
        themodel.Jobberz = new Dictionary<int, thetaskermvc.Models.Jobbers>();
        var jobbers = from Jobbers in Db.Jobbers.OrderBy(g => g.jobb_name) select Jobbers;
        foreach (Models.Jobbers ad in jobbers)
        {
            themodel.Jobberz.Add(ad.jobb_id,
                     new Models.Jobbers(ad.jobb_id, ad.jobb_name, ad.jobb_from, ad.jobb_carma, ad.jobb_status, ad.jobb_balance, ad.jobb_time));
        }
        if (themodel.Jobberz.Count == 0)
        {
            themodel.Jobberz.Add(-1, new Models.Jobbers(0, "NOTHING FOUND",DateTime.Now,0,"",0,0));
        }

   }

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

Итак. Если не сложно, расскажите мне о -нормально ли использовать такой подход, или есть какой-то другой «общий» способ?Потому что это неуклюжесть - этот подход работает ...

PS Я совсем новичок в Аспе, но ...

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

У меня есть one view model per view с данными из нескольких таблиц (если требуется). На мой взгляд, у меня есть данные, которые необходимо загрузить из 2 разных таблиц базы данных. В моем контроллере заявки на грант у меня есть следующее:

private readonly IBankService bankService;
private readonly IAccountTypeService accountTypeService;

public GrantApplicationController(IBankService bankService, IAccountTypeService accountTypeService)
{
     // Check incoming parameters for null values

     this.bankService = bankService;
     this.accountTypeService = accountTypeService;
}

В моем методе «Создать действие» я заполняю банки и типы счетов (которые будут использоваться в раскрывающихся списках) следующим образом (разные таблицы):

public ActionResult Create()
{
     GrantApplicationCreateViewModel viewModel = new GrantApplicationCreateViewModel
     {
          Banks = bankService.FindAll(),
          AccountTypes = accountTypeService.FindAll()
     }

     // Do what ever else you need to get done

     return View(viewModel);
}

Моему частичному виду модели хотелось бы:

public class GrantApplicationCreateViewModel
{
     public int BankId { get; set; }
     public IEnumerable<Bank> Banks { get; set; }
     public int AccountTypeId { get; set; }
     public IEnumerable<AccountType> AccountTypes { get; set; }

     // Other properties
}

В моем классе репозитория я использовал бы контекст базы данных следующим образом (я использую Entity Framework code first):

public class BankRepository : IBankRepository
{
     HefContext db = new HefContext

     public IEnumerable<Bank> FindAll()
     {
          return db.Banks.OrderBy(x => x.Name);
     }
}

В моем классе контекста базы данных:

public class HefContext : DbContext
{
     public DbSet<Bank> Banks { get; set; }
     public DbSet<AccountType> AccountTypes { get; set; }
}

Делая это таким образом, вы можете иметь одну модель представления, имеющую данные из нескольких источников. Надеюсь, это ответит на ваш вопрос? Если вам нужно больше объяснений, пожалуйста, дайте мне знать:)

1 голос
/ 20 марта 2012

Возможно, вы захотите взглянуть на в этом посте , где объясняется (с примером проекта), какой должна быть идеальная архитектура приложения MVC.

В приведенном выше примере кода вашне должно быть никаких ссылок на DbContexts в контроллере.Задача контроллера - контролировать поток запросов, не подключаться к БД и выполнять заполнение модели.

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