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

Есть необходимость создать 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
ASP.NET MVC получить данные из базы
    #38403727
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ASP.NET MVC получить данные из базы
    #38403728
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Zhulin,
Судя по посту, примеров у вас предостаточно.
Что бы вам как то объяснить.
Ответить те на вопрос? на сколько знаете хорошо
В процентах
1 Идеология MVC
2 Принцип работы орм, термин EF
3 ADO.net
4 Вы хотите спускать данные во вьюху в виде объектов классов ( проекции таблиц) или будете протаскивать туда датасет
и там его раскручивать в ручную?
...
Рейтинг: 0 / 0
ASP.NET MVC получить данные из базы
    #38403744
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ASP.NET MVC получить данные из базы
    #38403748
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

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

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

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

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

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

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


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