С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 17

Модель со связанными таблицами

13.05.2019, 07:21. Показов 1066. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Из заголовка суть вопроса понять сложно, поэтому постараюсь все объяснить на пальцах
Есть у меня вот такая моделька:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Area
    {
        public int ID { get; set; }
        public string areaName { get; set; }
        public ICollection<Station> Stations { get; set; }
        public Area()
        {
            Stations = new List<Station>();
        }
    }
 
    public class Station
    {
        public int ID { get; set; }
        public string statName { get; set; }
        public int? areaID { get; set; }
        public Area Area { get; set; }
    }
Значит есть контроллер:
C#
1
2
3
4
5
6
7
8
RouteSheetContext db = new RouteSheetContext();
        // GET: Station
        //Вывод всех станций
        public ActionResult Index()
        {
            var stations = db.Stations.Include(p => p.Area);
            return PartialView(stations.ToList());
        }
Вьюха:
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
@model IEnumerable<RouteSheet.Models.Station>
<div class="panel panel-primary">
    <div class="panel-heading">
        Станции
    </div>
    <table class="table table-striped">
        <tr>
            <th>Участок</th>
            <th>Станция</th>
            <th>@Html.ActionLink("Создать", "Create", "Station", null, new { @class = "btn btn-primary modalItem", style = "float:center; margin-right:5px" })</th>
        </tr>
 
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Area.areaName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.statName)
                </td>
                <td>
                    @Html.ActionLink("Изменить", "EditStation", new { id = item.ID },
                                                new { @class = "btn btn-primary btn-xs modalItem", style= "float:center; margin-right:5px" })
                </td>
            </tr>
        }
    </table>
</div>
Все работает все отображается, как и нужно.
А теперь магия(или не магия а моя не опытность):
Модель:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public class TypeLoko
    {
        public int ID { get; set; }
        public string tlName { get; set; }
        public ICollection<NumberLoko> NumberLokoes { get; set; }
        public TypeLoko()
            {
                NumberLokoes = new List<NumberLoko>();
            }
    }
      
    public class NumberLoko
    {
        public int ID { get; set; }
        public string nlName { get; set; }
        public int? tlID { get; set; }
        public TypeLoko TypeLoko { get; set; }
    }

Контроллер:
C#
1
2
3
4
5
6
7
8
9
10
public class NumberLokoController : Controller
    {
        RouteSheetContext db = new RouteSheetContext();
        // GET: NumberLoko
        public ActionResult Index()
        {
            var numberLokoes = db.NumberLokoes.Include(p => p.TypeLoko);
            return PartialView(db.NumberLokoes);
        }
    }
вьюха:
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
@model IEnumerable<RouteSheet.Models.NumberLoko>
<div class="panel panel-primary">
    <div class="panel-heading">
        Локомотивы:
    </div>
    <table class="table table-striped">
        <tr>
            <th>Тип локомотива</th>
            <th>№ Локомотива</th>
            <th>@Html.ActionLink("Создать", "Create", "Station", null, new { @class = "btn btn-primary modalItem", style = "float:center; margin-right:5px" })</th>
        </tr>
 
        @foreach (var item in Model)
        {
            <tr>
                <td>
                  
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.nlName)
                </td>
                <td>
                    @Html.ActionLink("Изменить", "EditStation", new { id = item.ID },
                                                new { @class = "btn btn-primary btn-xs modalItem", style= "float:center; margin-right:5px" })
                </td>
            </tr>
        }
    </table>
</div>
Ошибка:
System.Data.Entity.Core.EntityCommandExe cutionException: "An error occurred while executing the command definition. See the inner exception for details."

SqlException: Недопустимое имя столбца "TypeLoko_ID".

Вот от куда он берет, или где ищет "TypeLoko_ID".? что не правильно я делаю?

Скрипты создания таблиц:
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
CREATE TABLE dbo.Areas
(
ID INT NOT NULL IDENTITY (1,1) PRIMARY KEY 
,areaName nvarchar(15) NOT NULL
);
 
CREATE TABLE dbo.Stations
(
ID INT NOT NULL IDENTITY (1,1) PRIMARY KEY 
,areaID INT NOT NULL
,statName nvarchar(30) NOT NULL
FOREIGN KEY (areaID) REFERENCES Areas(ID) ON DELETE CASCADE
);
 
CREATE TABLE dbo.TypeLokoes
(
ID INT NOT NULL IDENTITY (1,1) PRIMARY KEY 
,tlName nvarchar(15) NOT NULL
);
 
CREATE TABLE dbo.NumberLokoes
(
ID INT NOT NULL IDENTITY (1,1) PRIMARY KEY 
,tlID INT NOT NULL
,nlName INT NOT NULL
FOREIGN KEY (tlID) REFERENCES TypeLokoes(ID) ON DELETE CASCADE
);
Добавлено через 9 минут
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2019, 07:21
Ответы с готовыми решениями:

Работа со связанными таблицами в БД через ASP
Сделал БД Access 97, прилинковал туда таблицы из других БД. А они в asp не видятся. Это нормально ? С уважением, Сергей.

Работа со связанными таблицами
Hi All! Есть две таблицы. Первая: КОД_БОЛЬНОГО ФИО_БОЛЬНОГО

Работа со связанными таблицами
Есть у меня три таблицы (показаны на рисунке), как мне вывести CustomerName из таблицы customer по CustomerID из таблицы order? Спасибо...

9
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 17
14.05.2019, 04:29  [ТС]
Вообщем друзья, я нашел 2 выхода из данной ситуации:
1. Мы переименовываем столбец tlID в typelokoID
2. Строку
C#
1
public TypeLoko TypeLoko { get; set; }
меняем на
C#
1
public TypeLoko tl { get; set; }
в контролере меняем
C#
1
var numberLokoes = db.NumberLokoes.Include(p => p.tl);
ну и вьюху изменяем
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 @foreach (var item in Model)
        {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.tl.tlName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.nlName)
            </td>
            <td>
                @Html.ActionLink("Изменить", "EditStation", new { id = item.ID },
                                            new { @class = "btn btn-primary btn-xs modalItem", style= "float:center; margin-right:5px" })
            </td>
        </tr>
Оставлю это здесь может кому то это понадобится.
0
7 / 5 / 2
Регистрация: 28.01.2019
Сообщений: 23
14.05.2019, 06:49
LLIPAM,
А указать у внешнего ключа virtual?
C#
1
2
public int? TypeLokoID { get; set; }
public virtual TypeLoko TypeLoko { get; set; }
0
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 17
14.05.2019, 12:40  [ТС]
Alex219, Возможно такой вариант, не подумал о нем надо будет его опробовать

Добавлено через 4 часа 51 минуту
Есть еще один вопрос вот есть такая моделька:

C#
1
2
3
4
5
6
7
8
9
public class TypeOfJobsNorm
    {
        public int ID { get; set; }
        public int? tlID { get; set; }
        public int? tojID { get; set; }
        public double tojnNorn { get; set; }
        public TypeLoko tl { get; set; }
        public TypeOfJob toj { get; set; }
    }
Как в контролере передать во вьювер два параметра?
C#
1
2
var norms = db.TypeOfJobsNorms.Include(p => p.tl);
            return PartialView(norms.ToList());
так я могу передать один параметр? а как передать второй параметр, таких параметров может быть и 3 и 5 и 10?
0
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 17
15.05.2019, 06:15  [ТС]
Подскажите люди добрые еще такой вопрос ( может кто встречался)
Есть модель:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class WeightNorm
    {
        public int ID { get; set; }
        public int? statBeginID { get; set; }
        public int? statEndID { get; set; }
        public int? tlID { get; set; }
        public int? areaID { get; set; }
        public int wnNorma { get; set;}
        public TypeLoko tl { get; set; }
        public Station statBegin { get; set; }
        public Station statEnd { get; set; }
        public Area area { get; set; }
    }
и модель:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class Station
    {
        public int ID { get; set; }
        public string statName { get; set; }
        public int? areaID { get; set; }
        public Area Area { get; set; }
        public ICollection<WeightNorm> WeightNorms { get; set; }
        public Station()
        {
            WeightNorms = new List<WeightNorm>();
        }
    }
как вы наверно заметили, поле statBeginID и statEndID ссылаются на ID модели Station.
Для чего это сделано? Station - хранит станции. statBeginID-это станция отправления локомотива statEndID-станция прибытия локомотива. Так вот как мне связать эти таблицы?
Вот контроллер:
C#
1
2
3
4
5
public ActionResult Index()
        {
            var norms = db.WeightNorms.Include(p => p.area).Include(p => p.statBegin).Include(p => p.statEnd).Include(p=>p.tl);
            return PartialView(norms.ToList());
        }
и тут ошибка:
SqlException: Недопустимое имя столбца "Station_ID".

Как мне это исправить?
0
7 / 5 / 2
Регистрация: 28.01.2019
Сообщений: 23
15.05.2019, 09:50
LLIPAM,
Цитата Сообщение от LLIPAM Посмотреть сообщение
Как в контролере передать во вьювер два параметра?
За ним сразу второй
C#
1
var norms = db.TypeOfJobsNorms.Include(p => p.tl).Include(p => p.toj);
Цитата Сообщение от LLIPAM Посмотреть сообщение
SqlException: Недопустимое имя столбца "Station_ID".
Вы используете подход Code First?
0
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 17
15.05.2019, 13:42  [ТС]
Alex219, база уже создана у меня
в модели строки все соответствуют строкам в БД.
C#
1
var norms = db.TypeOfJobsNorms.Include(p => p.tl).Include(p => p.toj);
с этим разобрался, все работает, делаю по аналогии с новой моделью, единственное отличие что 2е строки одной таблицы ссылаются на одну строку другой таблицы.
0
7 / 5 / 2
Регистрация: 28.01.2019
Сообщений: 23
17.05.2019, 09:10
LLIPAM, если метод Code First, то в модели Station
вместо
C#
1
2
3
4
public Station()
        {
            WeightNorms = new List<WeightNorm>();
        }
так
C#
1
2
public virtual ICollection<WeightNorm> WeightNormBegin{ get; set; }
public virtual ICollection<WeightNorm> WeightNormEnd{ get; set; }
и в контексте прописать fluent api
C#
1
2
3
4
5
6
7
8
9
10
11
12
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<WeightNorm>()
                    .HasRequired(m => m.statBegin)
                    .WithMany(t => t.WeightNormBegin)
                    .HasForeignKey(m => m.statBeginID )
 
        modelBuilder.Entity<WeightNorm>()
                    .HasRequired(m => m.statEnd)
                    .WithMany(t => t.WeightNormEnd)
                    .HasForeignKey(m => m.statEndID)
    }
и к свойствам модели WeightNorm - virtual припишите уже
C#
1
2
public virtual Station statBegin { get; set; }
public virtual Station statEnd { get; set; }
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
17.05.2019, 10:36
В самом первом сообщении в объявлении ошибка:
C#
1
2
3
4
5
6
7
public class NumberLoko
    {
        public int ID { get; set; }
        public string nlName { get; set; }
        public int? tlID { get; set; }
        public TypeLoko TypeLoko { get; set; }
    }
Если ты делаешь сущность по которой будет работать база данных, то при определении связи таблиц надо имена свойствам давать одинаковые, только в имени ИД связываемой записи добавить Id. А противном случае система сама создаст недостающее свойство и оно будет null, а у тебя будет ошибка.
поэтому тут правильно написать:
C#
1
2
3
4
5
6
7
public class NumberLoko
    {
        public int ID { get; set; }
        public string nlName { get; set; }
        public int? TypeLokoId { get; set; }
        public TypeLoko TypeLoko { get; set; }
    }
тогда и методы include<> будут работать правильно
0
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 17
17.05.2019, 15:17  [ТС]
yurickas,
Цитата Сообщение от yurickas Посмотреть сообщение
В самом первом сообщении в объявлении ошибка:

public class NumberLoko
* * {
* * * * public int ID { get; set; }
* * * * public string nlName { get; set; }
* * * * public int? tlID { get; set; }
* * * * public TypeLoko TypeLoko { get; set; }
* * }
Если ты делаешь сущность по которой будет работать база данных, то при определении связи таблиц надо имена свойствам давать одинаковые, только в имени ИД связываемой записи добавить Id. А противном случае система сама создаст недостающее свойство и оно будет null, а у тебя будет ошибка.
поэтому тут правильно написать:

public class NumberLoko
* * {
* * * * public int ID { get; set; }
* * * * public string nlName { get; set; }
* * * * public int? TypeLokoId { get; set; }
* * * * public TypeLoko TypeLoko { get; set; }
* * }
тогда и методы include<> будут работать правильно
Спасибо с этим разобрался, есть соглашения в EF о именовании, но с это можно обойти с помощью fluent api

Добавлено через 4 минуты
Alex219, Спасибо это вариант действительно будет работать, но сделал немного по другому
C#
1
public ICollection<WeightNorm> WeightNorms { get; set; }
и
C#
1
WeightNorms = new List<WeightNorm>();
я удалил в модели Station
и прописал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<WeightNorm>()
                .HasOptional(x => x.statBegin)
                .WithMany()                
                .HasForeignKey(x => x.statBeginID);
 
            modelBuilder.Entity<WeightNorm>()
                .HasOptional(x => x.statEnd)
                .WithMany()                
                .HasForeignKey(x => x.statEndID);
        }
Все заработало
А для чего виртуал прописывать? что то я не понимаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2019, 15:17
Помогаю со студенческими работами здесь

Работа со связанными таблицами
Ребят? подскажите пожалуйста, как работать со связанными таблицами Пример : Уменя есть табличка студенты(номер зачетки, фио, адрес,...

Работа со связанными таблицами
Этот вопрос я задал и в разделе VB, извините за дублирование, но это тесно связано с SQL/ База в SQL. Клиент на VB. в...

Связь combobox со связанными таблицами
Доброго времени суток! Поставил 2 combobox. В одной отображаются наименования региона, код региона - первичный ключ region_id. Во...

проблемы с TextBoxaми, связанными с таблицами
Проблем в следующем. Я связываю некоторые текстбоксы с определенной таблицей из датасет. После того, как пользователь вводит необходимую...

EF MVVM работа со связанными таблицами
Здравствуйте! Помогите пожалуйста разобраться. Изучаю обозначенный выше вопрос по сайту метанит.ком (не реклама). Но есть одна...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru