powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Модель со связанными таблицами
43 сообщений из 43, показаны все 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
Модель со связанными таблицами
    #39815059
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123это оверхед.

И давно?
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815064
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомPetro123это оверхед.

И давно?
В следующий раз вставь javascript:document.querySelectorAll('table.af-userid-27411').forEach(e => e.style.display = 'none') в адресной строке браузера и нажми Ввод :)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815107
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомPetro123это оверхед.

И давно?тебе сказали что фореген кей не пишут. А ты про слово оверхед.
Лучше скажи - НЕТ, Я ПИШУ FK.
И закончим на этом)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815110
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Агнец за бортомпропущено...


И давно?тебе сказали что фореген кей не пишут. А ты про слово оверхед.
Лучше скажи - НЕТ, Я ПИШУ FK.
И закончим на этом)

Я ни}{рена не понял.

Давно в EF не надо указывать вот это?

Код: c#
1.
2.
3.
4.
5.
 public class _project 
    {
        public Guid? projectID { get; set; } //<--- Это указывать не надо?
        public virtual project project { get; set; }
    }
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815117
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомвот этовот это что вот это?
Разговор был про конкретный FK.
А ты написал белиберду с гуидом.
Нормальный FK с integer не надо дублировать со времен ОРМ.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815137
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123А ты написал белиберду с гуидом.

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

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

No Foreign Key Property

No Foreign Key PropertyWhile it is recommended to have a foreign key property defined in the dependent entity class, it is not required. If no foreign key property is found, a shadow foreign key property will be introduced with the name <navigation property name><principal key property name>
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815159
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatАгнец за бортомГде-нибудт в доке, есть про это?

No Foreign Key Property

No Foreign Key PropertyWhile it is recommended to have a foreign key property defined in the dependent entity class, it is not required. If no foreign key property is found, a shadow foreign key property will be introduced with the name <navigation property name><principal key property name>


И в "простой" EF можно было также?

А как менять значение такого поля? С фронта приходит ID, получается - надо доставить из базы сущность по этому ID, чтобы её присвоить?
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815165
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомИ в "простой" EF можно было также?

Да, со времен появления code-first и POCO.

Агнец за бортомА как менять значение такого поля? С фронта приходит ID, получается - надо доставить из базы сущность по этому ID, чтобы её присвоить?


В коре это можно сделать через соответствующее "shadow property", как по ссылке написано. В "обычном" - не знаю, подозреваю даже, что никак - только доставать из базы связанную сущность. Но, в общем-то, все равно, перед тем как менять FK неплохо бы убедиться, что то, на что он будет ссылаться действительно существует (т.е. как раз эту сущность и запросить), потому что иначе надо ловить и обрабатывать SqlException, а с этим вообще беда, т.к. сиквель инфу об ошибке вообще практически никак не стуктурирует - пришла тебе строка с ошибкой, и бери гадай, что конкретно это за ошибка.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815184
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомPetro123А ты написал белиберду с гуидом.

Петя, тебе гуид не понравился?да. Зачем запутывать пример про FK?
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815185
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомА как менять значение такого поля? С фронта приходит ID, получается - надо доставить из базы сущность по этому ID, чтобы её присвоить?конкретнее.
Обычно приходит сущность. И обычно update FK не делают.
А доставать сущность из базы практически всегда надо. БЛ ведь).
...
Покажи как ты меняешь базу не вытаскивая сущности.
Ближе к коду!
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815224
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Обычно приходит сущность.

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

Ты что несёшь?бинес сущность в json.
Ты не выспался?
Или терминологию забыл.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815228
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял. У тебя только одна транзакция и сущность которая в базе.
Поэтому такая реакция.
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815408
Hanuman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стало интересно чем все закончится :)
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815443
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hanuman,

забанят петю :(
...
Рейтинг: 0 / 0
Модель со связанными таблицами
    #39815448
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosHanuman,

забанят петю :(вместе с тобой)
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Модель со связанными таблицами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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