Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 08.03.2013
Сообщений: 114

Ошибка при сложном запросе к БД (не найден столбец PROGRAMMId)

22.11.2019, 09:18. Показов 6065. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Работаю по примеру Модели со сложной структурой

Есть две таблицы SPR_PROGRAM (названия программ) и SPR_FINANS_PROGRAM (суммы по программе). Хочу вывести на одной странице таблицу в которой будет список программ с суммой по каждой из них. Таким образом пример подходит, где Player это мои программы, а Team - суммы (суммы могут быть разными, т.к. имеют дополнительный атрибут по статусу - утверждена/проектная и т.д.).

Модель
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
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
 
namespace WebKSP.Models
{
    public class BudjetModel
    {
 
    }
 
    public class SPR_FINANS_PROGRAM
    {
        [Key]
        public System.Guid Id { get; set; }
        [ForeignKey("Id")]
        public System.Guid GUID_PROG { get; set; }
        public Nullable<decimal> SUM_PLAN { get; set; }
        public Nullable<decimal> SUM_FINANS { get; set; }
        public SPR_PROGRAM SPR_PROGRAM { get; set; }
        //public IEnumerable<SPR_PROGRAM> SPR_PROGRAM { get; set; }
    }
 
    public class SPR_PROGRAM
    {
        [Key]
        public System.Guid Id { get; set; }
        public System.Guid GUID_ORG { get; set; }
        public string NAME { get; set; }
        public System.Guid STATUS { get; set; }
 
        public IEnumerable<SPR_FINANS_PROGRAM> SPR_FINANS_PROGRAM { get; set; }
    }
}
Контекст
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using WebKSP.Models;
 
namespace WebKSP.Data
{
    public class ModelDbContext : IdentityDbContext
    {
        public ModelDbContext(DbContextOptions<ModelDbContext> options)
            : base(options)
        {
        }
 
        public DbSet<SPR_FINANS_PROGRAM> SPR_FINANS_PROGRAM { get; set; }
        public DbSet<SPR_PROGRAM> SPR_PROGRAM { get; set; }
    }
}
Скрипты создания таблиц в БД
Кликните здесь для просмотра всего текста

Таблица SPR_PROGRAM
SQL
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
32
33
34
35
36
37
38
39
40
41
42
43
USE [WebKSP]
GO
 
/****** Object:  Table [dbo].[SPR_ORG]    Script Date: 05.11.2019 14:40:30 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[SPR_PROGRAM](
    [Id] UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
    [GUID_ORG] [uniqueidentifier] NOT NULL,
    [NAME] [nvarchar](1000) NULL,
    [STATUS] [uniqueidentifier] NOT NULL,
) ON [PRIMARY]
GO
 
ALTER TABLE [dbo].[SPR_PROGRAM]
ADD CONSTRAINT FK_GUID_ORG FOREIGN KEY ([GUID_ORG]) REFERENCES [dbo].[SPR_ORG] ([Id])
GO
 
ALTER TABLE [dbo].[SPR_PROGRAM]
ADD CONSTRAINT FK_STATUS FOREIGN KEY ([STATUS]) REFERENCES [dbo].[SPR_STATUS_PROGRAM] ([Id])
GO
 
INSERT INTO [dbo].[SPR_PROGRAM]
           ([GUID_ORG]
           ,[NAME],[STATUS])
     VALUES
           ('93F0B678-AFFF-E911-9C17-04D4C46926FF',
           'Развитие дорожного хозяйства на 2018 - 2020 годы',
           '12E57D7D-C5FF-E911-9C17-04D4C46926FF')
GO
 
INSERT INTO [dbo].[SPR_PROGRAM]
           ([GUID_ORG]
           ,[NAME],[STATUS])
     VALUES
           ('93F0B678-AFFF-E911-9C17-04D4C46926FF',
           'Развитие дорожного хозяйства на 2018 - 2020 годы',
           '13E57D7D-C5FF-E911-9C17-04D4C46926FF')
GO
Таблица SPR_FINANS_PROGRAM
SQL
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
USE [WebKSP]
GO
 
/****** Object:  Table [dbo].[SPR_ORG]    Script Date: 05.11.2019 14:40:30 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[SPR_FINANS_PROGRAM](
    [Id] UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
    [GUID_PROG] [uniqueidentifier] NOT NULL,
    [SUM_PLAN] [DECIMAL](18, 3) NULL,
    [SUM_FINANS] [DECIMAL](18, 3) NULL,
    ) ON [PRIMARY]
GO
 
ALTER TABLE [dbo].[SPR_FINANS_PROGRAM]
ADD CONSTRAINT FK_SPR_FINANS_PROGRAM_child FOREIGN KEY ([GUID_PROG]) REFERENCES [dbo].[SPR_PROGRAM] ([Id])
GO
 
INSERT INTO [dbo].[SPR_FINANS_PROGRAM]
           ([GUID_PROG]
           ,[SUM_PLAN]
           ,[SUM_FINANS])
     VALUES
           ('77DE7914-C9FF-E911-9C17-04D4C46926FF'
           ,1234.123
           ,1234.456)
GO


Контролер. Для вывода таблицы использую Index(). HTML шаблон думаю приводить нет смысла.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WebKSP.Data;
 
namespace WebKSP.Controllers
{
    public class BudjetController : Controller
    {
        private readonly ModelDbContext _context;
 
        public BudjetController(ModelDbContext contextA)
        {
            _context = contextA;
        }
 
        // GET: Budjet
        public ActionResult Index()
        {
            //return View(_context.SPR_BUDJET_SECTION_NAME.ToList());
 
            //var programms = _context.SPR_PROGRAM.Include(p => p.);
            var programms = _context.SPR_FINANS_PROGRAM.Include(p => p.SPR_PROGRAM);
 
            //var fin = _context.SPR_PROGRAM.Include(o => o.SPR_FINANS_PROGRAMs);
            return View(programms.ToList());
            //return View(fin.ToList());
        }
 
        // GET: Budjet/Details/5
        public ActionResult Details(int id)
        {
            return View();
        }
 
        // GET: Budjet/Create
        public ActionResult Create()
        {
            return View();
        }
 
        // POST: Budjet/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(IFormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here
 
                return RedirectToAction(nameof(Index));
            }
            catch
            {
                return View();
            }
        }
 
        // GET: Budjet/Edit/5
        public ActionResult Edit(int id)
        {
            return View();
        }
 
        // POST: Budjet/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(int id, IFormCollection collection)
        {
            try
            {
                // TODO: Add update logic here
 
                return RedirectToAction(nameof(Index));
            }
            catch
            {
                return View();
            }
        }
 
        // GET: Budjet/Delete/5
        public ActionResult Delete(int id)
        {
            return View();
        }
 
        // POST: Budjet/Delete/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Delete(int id, IFormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here
 
                return RedirectToAction(nameof(Index));
            }
            catch
            {
                return View();
            }
        }
    }
}
Компилируется без ошибок. При попытке загрузки страницы с таблицей выпадает ошибка
Code
1
+       $exception  {"Недопустимое имя столбца \"SPR_PROGRAMId\".\r\nНедопустимое имя столбца \"SPR_PROGRAMId\"."}  Microsoft.Data.SqlClient.SqlException
По гуглу непонятно в чем может быть проблема. Кто-то говорит навигационные ключи нужно прописать в БД, кто-то говорит, что их нужно прописывать в коде модели. Эти подсказки не сработали.
Вроде все что видел, уже проверил. Контекст работает. Модели работают - простые данные получаются без проблем. Сложный запрос вроде как в примере. Почему при сложном запросе происходит объединение имени таблицы и столбца, я не понимаю.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2019, 09:18
Ответы с готовыми решениями:

Сортировка в сложном запросе
Ребята помогите, есть запрос, нужно чтобы при выборке из таблицы goods товар сортировался в алфавитном порядке, куда сортировку впихнуть? ...

Переменная в переменной в сложном запросе к БД.
У меня сложный запрос в БД &lt;% MyYear = Request.QueryString('MyYears') MyMonth = Request.QueryString('MyMonth') Rubrica =...

SQLLite3: Boolean в сложном select запросе
Всем здравствуйте. Возникла проблема с написанием SELECT-запроса к таблице, в котором много условий выборки. Таблица...

50
1 / 1 / 0
Регистрация: 08.03.2013
Сообщений: 114
27.11.2019, 11:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Вам не нужно знать эти цифры. От слова совсем. Что с чем связывается показывает название колонки и FOREIGN KEY CONSTRAINT.
Вот когда программирование у меня выйдет за рамки хобби, и чистого времени наберется год - я буду мыслить как программист, объектами.
А сейчас я желторотый новичок без опыта и знаний. Да в своем деле я крепкий профессионал, а в программировании неопытен.
Делайте скидку.

Ваше замечание, поверьте, я учту. Вы по ветке видите, что я принимаю помощь и учусь, читаю, думаю над прочитанным и пытаюсь применять. Но на данном этапе мне приходится смотреть сами данные, чтобы понимать что, откуда берется и куда идет.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9507 / 1362
Регистрация: 21.01.2016
Сообщений: 35,851
27.11.2019, 11:55
defond57, ладно. Не берите близко к сердцу. Моё дело указать вам не кривость подхода. Если вы это учтёте - гуд.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
27.11.2019, 12:02
Числовые ID проще прогнозировать , увидев хоть один такой на странице , можно запросто подтянуть чужие данные.
Guid можно генерировать на уровне логики приложения , в некоторых сценариях это нужно и удобно.
В целом их удобно юзать , например в inmemory dictionary справочниках , т.к они уникальны , а вот с числовым ID такой гарантии уже не будет.
Числовие значения , если автоинкремент и БД часто перезаписывается , рано или поздно приведут к сбросу счетчика , что чревато.
С числовыми ID больше сложностей при репликации.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9507 / 1362
Регистрация: 21.01.2016
Сообщений: 35,851
27.11.2019, 12:04
sau, числовой ID тоже уникален в рамках таблицы. Если записей совсем много вставляется, то можно использовать и BIGINT, который переполнится не факт, что при жизни тех, кто систему разрабатывал. GUID тоже не гарантирует вечной уникальности, ибо его размерность ограниченна.

Цитата Сообщение от sau Посмотреть сообщение
С числовыми ID больше сложностей при репликации.
Тут репликацией и не пахнет.
0
1 / 1 / 0
Регистрация: 08.03.2013
Сообщений: 114
27.11.2019, 12:07  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
ладно. Не берите близко к сердцу. Моё дело указать вам не кривость подхода. Если вы это учтёте - гуд.
Обязательно приму.
Я же имена таблиц в БД переделал сразу же. )
Учится, особенно когда тебе помогают и направляют, это интересно. А главное - у меня получается
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
27.11.2019, 13:48
Цитата Сообщение от Usaga Посмотреть сообщение
GUID тоже не гарантирует вечной уникальности, ибо его размерность ограниченна.
Сомневаюсь. BIGINT какой размерности? 64 бита кажись? а GUID - 128
0
Эксперт .NET
 Аватар для Usaga
14731 / 9507 / 1362
Регистрация: 21.01.2016
Сообщений: 35,851
27.11.2019, 18:33
yurickas, в чём вы сомневаетесь?) Что GUID тоже не бесконечный?
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
27.11.2019, 20:15
Бесконечной бывает только глупость, а инт закончится быстрее быстрее гуайда - это факт
0
Эксперт .NET
 Аватар для Usaga
14731 / 9507 / 1362
Регистрация: 21.01.2016
Сообщений: 35,851
27.11.2019, 20:31
yurickas, место на вашем RAID-массиве из кучи дисков закончится раньше, чем вы успеете вставить 2^63 записей. Обе размерности - конские. Мы изначально сравнивали удобство использования. А вопрос переполнения уже притянули как какой-то последний аргумент.
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
27.11.2019, 23:50
Цитата Сообщение от sau Посмотреть сообщение
Числовые ID проще прогнозировать , увидев хоть один такой на странице , можно запросто подтянуть чужие данные.
Доступ к чужим данным - это уже другой вопрос.
Вот, статейка 7-летней давности: Why GUID primary keys are a database’s worst nightmare

Добавлено через 3 минуты
That means that unlike our auto-number field with a high key-density, our Guid keys are designed to be sparse, or to have a low key-density
using Guid’s as a primary key in the B+Tree will work but much more slowly at large volumes (2+ million)
Ordered (or near-ordered) keys will provide linear scalability whereas unique random GUIDs will start to suffer once you’ve exceeded the cache space.
Резюме:
Want you should take away is that the density of keys being written to in that first field of your primary key will ultimately dictate your write throughput and likely your scalability. Be conscious of this, and choose keys wisely
0
Эксперт .NET
 Аватар для Usaga
14731 / 9507 / 1362
Регистрация: 21.01.2016
Сообщений: 35,851
28.11.2019, 07:31
IamRain, единственные две ситуации, когда я вижу использование GUID'ов:
а) Нужен ID уникальный среди нескольких систем. Но этот ID не обязан быть первичным ключом в нашей системе, просто отдельной колонкой с уникальным индексом.
б) На случай огромного количества вставок короткоживущих записей (быстро удаляются после создания). Тогда да, GUID можно считать бесконечным. Но это какой-то супер узкоспециализированный кейс. И тот, наверное, лучше решается через rowversion \ timestamp.

Поэтому я реально не понимаю, как можно оправдывать GUID'ы в виде первичныйх ключей...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2019, 07:31

Примение LIKE к составному полю в сложном запросе (с inner join)
Привет. Есть следующий запрос SELECT `c`.`id`, concat(`c`.`firstname`, ' ', `c`.`lastname`, ' ', `c`.`midname`) as `fio`,...

OleDbDataReader - вылетает ошибка, что такой столбец не найден, но имя такое есть
Пытаюсь обратиться к столбцу в запросе по имени - вылетает ошибка, что такой столбец не найден, но имя такое есть. OleDbConnection StrCon...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru