Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET MVC получить данные из базы / 10 сообщений из 10, страница 1 из 1
21.09.2013, 23:16
    #38403713
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Добрый день!

Есть необходимость создать ASP.NET MVC приложение, отображающее список лицевых счетов.
Для этого прочитал Pro ASP.Net MVC 4 откуда и взял основу для своих примеров

1. Создаю модель

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Comunal_services.Domain.Entities
{
    public class Individual // Класс для владельцев лицевых счетов
    {
        public int id { get; set; }
        public string Family_Name { get; set; }
        public string First_Name { get; set; }
        public string Fathers_Name { get; set; }
    }

    public class Account // Класс для счетов
    {
        public int id { get; set; }
        public Individual Account_Individual { get; set; }
    }
}



2. Создаю интерфейс для контроллера

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Comunal_services.Domain.Entities;

namespace Comunal_services.Domain.Abstract
{
    public interface IAccountRepository
    {
        IQueryable<Account> Accounts { get; }
    }
}



3. Далее сам контроллер

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comunal_services.Domain.Abstract;
using Comunal_services.Domain.Entities;

namespace Comunal_services.WebUI.Controllers
{
    public class AccountsController : Controller
    {
        private IAccountRepository repository;

        public AccountsController(IAccountRepository accountRepository)
        {
            this.repository = accountRepository;
        }

        public ViewResult List()
        {
            return View(repository.Accounts);
        }
    }
}



4. К контроллеру сделал View такого типа

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
@model IEnumerable<Comunal_services.Domain.Entities.Account>

@{
    ViewBag.Title = "Лицевые счета";
}

<table width="100%">
    <tr>
        <th>Фамилия</th>
        <th>Имя</th>
        <th>Отчество</th>
    </tr>
@foreach (var p in Model)
{
    <tr>
        <td>@p.Account_Individual.Family_Name</td>
        <td>@p.Account_Individual.First_Name</td>
        <td>@p.Account_Individual.Fathers_Name</td>
    </tr>
}
</table>



Вот этот котроллер нужно наполнить данными из имеющейся базы MS SQL Server.
Если опираться далее на примеры из книжки, то нужно создать класс наследник от DbContext, который ассоциирует модель с базой данных

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
using System.Data.Entity;
using Comunal_services.Domain.Entities;

namespace Comunal_services.Domain.Concrete
{
    public class EFDbContext : DbContext
    {
        public DbSet<Account> Accounts { set; get; }
    }
}



Добавить класс наследуемый от интерфейса IAccountRepository

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using System.Linq;
using Comunal_services.Domain.Abstract;
using Comunal_services.Domain.Entities;

namespace Comunal_services.Domain.Concrete
{
    public class EFAccountRepositiry : IAccountRepository
    {
        private EFDbContext context = new EFDbContext();

        public IQueryable<Account> Accounts {
            get {return context.Accounts; }
        }
    }
}



И далее при помощи библиотеки Ninject связать класс EFAccountRepositiry с интефейсом контроллера IAccountRepository примерно вот так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
using Ninject;
using Comunal_services.Domain.Entities;
using Comunal_services.Domain.Abstract;
using Comunal_services.Domain.Concrete;
using System.Collections.Generic;
using System.Linq;
using Moq;

namespace SportsStore.WebUI.Infrastructure
{
    public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel ninjectKernel;
        public NinjectControllerFactory()
        {
            ninjectKernel = new StandardKernel();
            AddBindings();
        }
        protected override IController GetControllerInstance(RequestContext
        requestContext, Type controllerType)
        {
            return controllerType == null
            ? null
            : (IController)ninjectKernel.Get(controllerType);
        }
        private void AddBindings()
        {
            ninjectKernel.Bind<IAccountRepository>().To<EFAccountRepositiry>();
        }
    }
}



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

Это возможно?
Если да, то можно примеры?

Спасибо.
...
Рейтинг: 0 / 0
22.09.2013, 00:30
    #38403727
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Alex Zhulin,

не совсем понял, что именно вам не подходит
соглашения существуют, но никто не запрещает вам использовать собственный способ отражения на модель

используемый вами подход в работе с базой данных называется Code First (Entity Framework)
т.е. вы работаете с моделью данных, отраженных на классы
(я бы рекомендовал при любых раскладах забыть про DataSet как про страшный сон)

кое что надо исправить:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
namespace Comunal_services.Domain.Entities
{
    public class Individual // по умолчанию сгенерируется таблица dbo.Individuals
    {
        public int Id { get; set; } // соглашение
        public string FamilyName { get; set; }
        public string FirstName { get; set; }
        public string FathersName { get; set; }
    }

    // добавьте [Table("OtherNameForTable") чтобы изменить название таблицы
    public class Account // dbo.Accounts
    {
        public int Id { get; set; }
        
        public int AccountIndividualId { get; set; } // внешний ключ, добавьте ? после int, если связь не обязательная
        public virtual Individual AccountIndividual { get; set; } // тут нужен virtual
    }
}



как гибко управлять отражением с помощью Fluent API, читайте на хабре: http://habrahabr.ru/post/174709/
на MSDN: http://msdn.microsoft.com/en-us/library/hh295844(v=vs.103).aspx

в общем, используя Code First + Entity Framework 6 возможно абсолютно всё.
и процедуры вызывать, и мапить процедуры, исполнять SQL, управлять связями таблиц, ключами и индексами как хотите.
просто немного надо вникнуть в тему.

не понятно, что конкретно вас не устраивает

П.С. рекомендую обратить внимание вместо Ninject на Autofac -- более удобная либа с очень хорошей интеграцией в MVC 4/5
...
Рейтинг: 0 / 0
22.09.2013, 00:32
    #38403728
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Alex Zhulin,
Судя по посту, примеров у вас предостаточно.
Что бы вам как то объяснить.
Ответить те на вопрос? на сколько знаете хорошо
В процентах
1 Идеология MVC
2 Принцип работы орм, термин EF
3 ADO.net
4 Вы хотите спускать данные во вьюху в виде объектов классов ( проекции таблиц) или будете протаскивать туда датасет
и там его раскручивать в ручную?
...
Рейтинг: 0 / 0
22.09.2013, 01:39
    #38403744
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Alex Zhulin,
Судя по и на основе некого внутреннего соглашения имен классов ..))
Выкиньте ваш проект, он выносит вам мозг.
Начните новый проект
Создайте модель с ленивой загрузкой
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public class MyClassModel
    {
        private DataSet _dataSet;
        public DataSet DataSet
        {
            get { return _dataSet ?? (_dataSet = GetDataSet()); }
        }

        static DataSet GetDataSet()
        {
            //Что то типа из Ado net
            return new DataSet();
        }
    }


Зарегистрируйте модель во вьюхе,

и самый простой контроллер
Код: c#
1.
2.
3.
4.
5.
6.
7.
  public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new MyClassModel());
        }
    }


и все, крутите во вьюхе свой датасет ( я предпологаю выбор пал на него, так как вам он знаком)..
это конечно будет курьез, но это будет работать..
...
Рейтинг: 0 / 0
22.09.2013, 01:58
    #38403748
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Где-то в степи,

что-то я не понял логики MyClassModel -- это что?
"модель" которая сама себя из базы вытаскивает в виде олдскульного датасета? бррр...
и что делать во вьюхе с нетипизированным датасетом?
в чем профит?

даже если товарищ с пеленок работал с датасетом,
учитывая тот факт, что он копает в сторону MVC,DI,EF/CF
имхо такие финты ну явно здесь не уместны.

похоже на то, что его не устраивает ограничение в виде соглашений,
так это элементарно решается. способы отразить адекватную схему
на классы в Code First имеются. в последней версии EF 6 так вообще
можно задавать свои собственные соглашения, что вообще тру.
...
Рейтинг: 0 / 0
22.09.2013, 02:00
    #38403749
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Где-то в степи,

и еще по поводу "ленивой" загрузки, проброшенной во вьюху...
надеюсь вы так никогда не делаете? :-)
...
Рейтинг: 0 / 0
22.09.2013, 02:44
    #38403756
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
hVostt,

- Что там за шум на улице, Бэрримор?
- Это гей-парад, сэр.
- И чего же они требуют, Бэрримор?
- Однополой любви, сэр.
- Им разве кто-то запрещает?
- Нет, сэр.
- Так почему же всё-таки они шумят?
- Пидорасы, сэр.
...
Рейтинг: 0 / 0
22.09.2013, 03:24
    #38403764
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Где-то в степи,

мда...
...
Рейтинг: 0 / 0
22.09.2013, 08:40
    #38403788
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
hVosttAlex Zhulin,


как гибко управлять отражением с помощью Fluent API, читайте на хабре: http://habrahabr.ru/post/174709/
на MSDN: http://msdn.microsoft.com/en-us/library/hh295844(v=vs.103).aspx

в общем, используя Code First + Entity Framework 6 возможно абсолютно всё.
и процедуры вызывать, и мапить процедуры, исполнять SQL, управлять связями таблиц, ключами и индексами как хотите.
просто немного надо вникнуть в тему.

не понятно, что конкретно вас не устраивает

П.С. рекомендую обратить внимание вместо Ninject на Autofac -- более удобная либа с очень хорошей интеграцией в MVC 4/5

Спасибо, по Вашему ответу смутно, но вроде понял в какую сторону гуглить.
Буду разбираться.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.07.2016, 20:04
    #39276638
mr.Dream
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET MVC получить данные из базы
Alex Zhulin, здравствуйте!
Я тоже изучаю MVC и тоже по книге Адама Фримена (сужу по приведенному вами коду).
Мне также ясен ваш вопрос, относительно возможности генерации класса не на основе таблицы БД, а на основе select-а из хранимой процедуры. Прошло немало времени, но все же: какое у вас в итоге получилось решение?
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET MVC получить данные из базы / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]