powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Модель со связанными таблицами
25 сообщений из 43, страница 1 из 2
Модель со связанными таблицами
    #39813802
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите люди добрые такой вопрос ( может кто встречался)
Есть модель:
Код: 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 / 0
Модель со связанными таблицами
    #39813812
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе надо cконфигурировать навигационные свойства в методе контекста OnModelCreating. Что-то наподобие:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
protected override void OnModelCreating(DbModelBuilder builder)
{
    builder.Entity<WeightNorm>()
        .HasOne(x => x.statBegin)
        .WithMany(x => x.WeightNorms);

    builder.Entity<WeightNorm>()
        .HasOne(x => x.statEnd)
        .WithMany(x => x.WeightNorms);
}
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39813979
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 protected override void OnModelCreating(DbModelBuilder builder)
{
    builder.Entity<WeightNorm>()
        .HasOne(x => x.statBegin)
        .WithMany(x => x.WeightNorms);

    builder.Entity<WeightNorm>()
        .HasOne(x => x.statEnd)
        .WithMany(x => x.WeightNorms);
} 

ругается на .HasOne(x => x.statBegin) :(
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39813983
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,
Возьмите любой пример один ко многим с FK.
И отработайте его чтоб работало.
...
Поле statBeginID лишнее. Есть поле класса.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814002
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanumanругается на .HasOne(x => x.statBegin) :(
Мне сейчас без интеллисенса вспомнить точный вызов тяжело, поизучай вот это: https://docs.microsoft.com/en-us/ef/core/modeling/relationships - там все описано.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814117
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123 Поле statBeginID лишнее. Есть поле класса. Не совсем понял, почему это поле лишнее? А тогда поле statEndID тоже лишнее?
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814122
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,
Угу.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814136
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HanumanPetro123 Поле statBeginID лишнее. Есть поле класса. Не совсем понял, почему это поле лишнее? А тогда поле statEndID тоже лишнее?

Вообще, можно и так и так. Раньше то ли требовалось (то ли просто было принято - уже не помню) дублировать навигационные свойства айдишниками ентитей на которые они указывают. Сейчас это необязательно, есть, в общем-то сторонники такого подхода (иногда это позволяет некоторые дела ускорить). Лично мне эта избыточность не нравится, ибо POCO, коде-ферст и бла-бла-бла. К тому же (не уверен насчет обычного EF) в ефкоре это доступно через т.н. Shadow Properties (это поля БД, которые доступны, но не отмепленны на свойства объекта).
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814158
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,

Сейчас попробовал (EF Core) смотри, тут есть еще такая засада, что есть ограничение - одно свойство, в этом случае
Код: c#
1.
public ICollection<WeightNorm> WeightNorms { get; set; }


не может учавствовать сразу в двух отношениях (ну, это, типа ЕФ так себя ведет). Так что надо либо его вообще убрать и работать только через свойства statBegin, statEnd и делать так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<WeightNorm>()
        .HasOne(x => x.statBegin)
        .WithMany()
        .IsRequired(false)
        .HasForeignKey(x => x.statBeginID);

    modelBuilder.Entity<WeightNorm>()
        .HasOne(x => x.statEnd)
        .WithMany()
        .IsRequired(false)
        .HasForeignKey(x => x.statEndID);
}



, либо заводить два разных WeightNorms:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<WeightNorm>()
        .HasOne(x => x.statBegin)
        .WithMany(x => x.WeighNormsBegin)
        .IsRequired(false)
        .HasForeignKey(x => x.statBeginID);

    modelBuilder.Entity<WeightNorm>()
        .HasOne(x => x.statEnd)
        .WithMany(x => x.WeighNormsBegin)
        .IsRequired(false)
        .HasForeignKey(x => x.statEndID);
}




Ни в том, ни в другом случае на структуру самой БД это не повлияет.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814159
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во втором куске кода, там конечно,

Код: c#
1.
.WithMany(x => x.WeighNormsBegin)



и

Код: c#
1.
.WithMany(x => x.WeighNormsEnd)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814250
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
Код: c#
1.
public ICollection<WeightNorm> WeightNorms { get; set; }

Как я понял в первом варианте в модели я это удаляю.
тогда у меня модель останется:
Код: 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.
public class Station
    {
        public int ID { get; set; }
        public string statName { get; set; }
        public int? areaID { get; set; }
        public Area Area { get; set; }       
        public Station()
        {
            WeightNorms = new List<WeightNorm>();
        }
    }
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.
 public int? statBeginID { get; set; }
        public int? statEndID { get; set; }


Это может быть и лишнее, но на данный момент мне так проще, я вижу все поля своих таблиц, и мне как новичку это удобно. В моем коде если вы его посмотрите, многое можно оптимизировать, что то лишнее, что то можно было более компактно описать :) так что не судите строго за "кривой код" :) за все советы спасибо :) завтра буду тестировать, и отпишусь о результатах :)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814251
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,

да, только

Код: c#
1.
WeightNorms = new List<WeightNorm>();



убери еще, а то ошибка будет.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814252
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,

Чем неудобны доп. поля с айдишкаим - они при изменении сущности могут рассинхронизироваться с указателями.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814360
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat Чем неудобны доп. поля с айдишкаим - они при изменении сущности могут рассинхронизироваться с указателями. Получается в самой БД эти поля тоже не нужны?
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814363
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно вот так у меня заработало:

Код: 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);
        }


На HasOne у меня ругался, возможно моя версия EF это не поддерживает.
.IsRequired(false) - тоже начал ругаться, просто удалил ( может я не прав поправьте меня)
Спасибо Вам товарищи что помогли разобраться :) Эта наверно не последняя моя тема с просьбой помочь, так что буду Вам рад :)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814366
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanumanfkthat Чем неудобны доп. поля с айдишкаим - они при изменении сущности могут рассинхронизироваться с указателями. Получается в самой БД эти поля тоже не нужны?
Нет, в БД они конечно нужны (иначе как EF посвязывает эти сущности). Просто при code first они автоматом создадутся в миграции, при db first нужен будет дополнительный fluent вызов чтобы дать EF понять какое поле в БД отвечает за эту связку.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814367
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HanumanСобственно вот так у меня заработало:

Код: 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);
        }


На HasOne у меня ругался, возможно моя версия EF это не поддерживает.
.IsRequired(false) - тоже начал ругаться, просто удалил ( может я не прав поправьте меня)
Спасибо Вам товарищи что помогли разобраться :) Эта наверно не последняя моя тема с просьбой помочь, так что буду Вам рад :)

Да, я пробовал на EF Core - там немного по-другому. Но, вообще, мне кажется, что EF Core и так бы заработал, на основе conventions - он по-умолчанию если видит указатель от одной entity к другой, то связывает их по FK базы данных.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814375
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще вопрос, к теме не относится, но я его задам что бы не создавать новую тему :)
В модели есть поля:
Код: c#
1.
2.
3.
 public decimal waDistancia { get; set; }
        public decimal waSCC { get; set; }
        public decimal waReserv { get; set; }


База создавалась вот так:
Код: sql
1.
2.
3.
 [waDistancia]  DECIMAL (5, 2) DEFAULT (NULL) NULL,
    [waSCC]        DECIMAL (5, 2) DEFAULT (NULL) NULL,
    [waReserv]     DECIMAL (5, 2) DEFAULT (NULL) NULL,


у меня допускается значение NULL, но вылазит ошибка

The 'waSCC' property on 'WorkArea' could not be set to a 'null' value. You must set this property to a non-null value of type 'System.Decimal

Почему то ругается на нулевые поля.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814377
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут наверно нужно использовать все таки
IsRequired() , но у меня на него почему то ругается.... Может опять из за версии EF :)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814384
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,

Код: c#
1.
2.
3.
public decimal? waDistancia { get; set; }
public decimal? waSCC { get; set; }
public decimal? waReserv { get; set; }



для nullable полей БД надо свойства модели тоже объявлять как nullable, имхо, это даже интуитивно должно быть очевидно.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814695
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat Вот моя не внимательность :)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814968
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а я не понял - почему у ТС не работает код из первого примера?

У него же всё правильно (почти).


Petro123Поле statBeginID лишнее. Есть поле класса.
Что это значит??
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814976
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомТак а я не понял - почему у ТС не работает код из первого примера?

Потому что отношение было ен сконфигурировано. Там же ниже все расписано.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39814979
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatАгнец за бортомТак а я не понял - почему у ТС не работает код из первого примера?

Потому что отношение было ен сконфигурировано. Там же ниже все расписано.

Ты про Fluent API?

Это для какой EF?

Для EF 6 - Fluent API - опция, выбор.


Того, что сделал ТС - должно быть достаточно.

И потом - SqlException - не про "отношение было ен сконфигурировано"

Может быть - он пытается создать БД, не уничтожив предыдущую?
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815014
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомЧто это значит??
это оверхед.
В коде можно и нужно работать через поле класса сущности, а не через поле ID сущности.
Кодами FK занимается ОРМ.
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Модель со связанными таблицами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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