Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,058
1

Entity framework добавляет сущность, когда этого не просили

15.05.2024, 15:48. Показов 941. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В комментариях описан текущих ход событий тестового прогона, а не общий случай
C#
1
2
3
4
5
6
7
8
9
10
// Добавляю CpuSpecs
    await db.CpuSpecs.AddOrUpdateByIdHardwareAsync<CpuSpec,int>(new CpuSpec(
                        hardware,
                        (short?)1111,
                        (short?)11,
                        "Test",
                        null, 
                        11,
                        111)
                    ));
Вот вызывается конструктор CpuSpec
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
public partial class CpuSpec
{
    public CpuSpec(Hardware HardwareEntity, double? Freq = null, short? Cores = null, string Socket = null, long? IdIgp = null, short? CoresLogic = null, short? Tdp = null, bool? ClockMultiplier = null, short? ChacheL2 = null, short? ChacheL3 = null)
    {
        Socket SocketEntity;
 
        TitaniumComparatorContext db = new TitaniumComparatorContext();
        SocketEntity = db.Sockets.AddOrGetSaveAsync(Socket).Result; // ← Находится существующий сокет с id 0
        db.SaveChanges(); // 0, изменений нет, ошибок нет
 
 
        this.IdSocketNavigation = SocketEntity; // присваиваю навигацию к уже существующим сущностям
        this.IdHardwareNavigation = HardwareEntity;
        this.IdHardware = HardwareEntity.Id;
        this.Freq = Freq.HasValue? (byte?)Math.Round(Freq.Value*10) : null;
        this.Cores = Cores;
        this.IdSocket = SocketEntity is null? null : IdSocketNavigation.Id; //: Присваиваю Id найденной сущности
        this.IdIgp = IdIgp;
        this.CoresLogic = CoresLogic;
        this.Tdp = Tdp;
        this.ClockMultiplier = ClockMultiplier;
        this.ChacheL2 = ChacheL2;
        this.ChacheL3 = ChacheL3;
    }
 
    public CpuSpec()
    {
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public static async Task<T> AddOrUpdateByIdHardwareAsync<T,TIdType>(this DbSet<T> DbSet, T Entity) where T : class, IEntityIdHardware<TIdType>, new()
    {
        var foundEntity = await DbSet.FirstOrDefaultAsync(e => e.IdHardware.Equals(Entity.IdHardware));
 
        if (foundEntity == null) return DbSet.Add(Entity).Entity; //← Сущность (CpuSpec) существует, идём дальше
                   
        foundEntity.UpdateProps(Entity); // обновляются свойства foundEntity, которые есть (не null) у Entity
        return foundEntity;
    }
 
    //Entity.Cores = EntityChanges.Cores; и так далее
    public static void UpdateProps<T>(this T Entity, T EntityChanges) where T : class
    {
        foreach(var toProp in typeof(T).GetProperties())
        {
            var fromProp= typeof(T).GetProperty(toProp.Name);
            var toValue = fromProp.GetValue(EntityChanges, null);
            if (toValue != null)
            {
                toProp.SetValue(Entity, toValue, null);
            }
        }
    }

Возвращаемся в
C#
1
2
3
4
await db.CpuSpecs.AddOrUpdateByIdHardwareAsync<CpuSpec,int>(
//...
)
await db.SaveChangesAsync(); //← исключение
Нарушено "PK_Sockets" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo.Sockets"
Ошибка добавления Sockets возникает при попытке обновления CpuSpec.
Я так понимаю, что EntityRakework "облегчает" мне задачу, подсовывая создание Sockets из-за того, что я добавил навигацию к этой сущности. А как сделать, чтобы он этого не делал?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2024, 15:48
Ответы с готовыми решениями:

Не дает сохранить сущность в Entity Framework
мой Context: protected override void OnModelCreating(ModelBuilder modelBuilder) { ...

Понятия Сущность, Модель и Контекст в Entity Framework Core
СУШНОСТЬ - это то, что описываем: объект, процесс. Это вещи о которых хотим хранить данные....

Entity Framework добавляет ненужный столбец в запрос
Всем привет! Подскажите, кто в курсе, как сделать связку между классами которые представлюят собой...

Entity framework не добавляет новое значение в базу данных
Всем привет, делаю возможность добавления в друзья у себя на сайте. У меня есть база, в которой...

23
3635 / 2551 / 714
Регистрация: 02.08.2011
Сообщений: 6,889
15.05.2024, 22:15 2
Лучший ответ Сообщение было отмечено Титан_1 как решение

Решение

Цитата Сообщение от Титан_1 Посмотреть сообщение
А как сделать, чтобы он этого не делал?
Указывать FK на запись сокета вместо Navigation Property.

Код у вас с запашком: EF-сущности ничего не должны знать о своих DB-контекстах, это просто плоские модели с данными.
Есть такой паттерн - Repository, используйте его.

Добавлено через 33 секунды
По-хорошему надо бы глянуть на код моделей.
0
Эксперт .NET
12286 / 8638 / 1307
Регистрация: 21.01.2016
Сообщений: 32,504
16.05.2024, 04:38 3
Цитата Сообщение от Титан_1 Посмотреть сообщение
TitaniumComparatorContext db = new TitaniumComparatorContext();
        SocketEntity = db.Sockets.AddOrGetSaveAsync(Socket).Result; // ← Находится существующий сокет с id 0
        db.SaveChanges(); // 0, изменений нет, ошибок нет
Вот это максимально отвратительный подход. В конструкторе сущности ни к какой базе (ни к файлу, ни запрос к сети) лезть нельзя.
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,793
16.05.2024, 14:28 4
Цитата Сообщение от Титан_1 Посмотреть сообщение
Entity framework добавляет сущность, когда этого не просили
Типичная проблема со всеми ОРМ. Вы никогда не заставите ОРМ делать то, что вы хотите. Это он будет делать то, что он хочет. Не здесь, так в чём нибудь другом. Привыкайте.
А лучше отвыкайте от вебоговнкодерского подхода, выкиньте EF в помойку и используйте нормальный SQL, который и был создан для работы с БД.
0
2643 / 1902 / 356
Регистрация: 14.08.2018
Сообщений: 6,133
Записей в блоге: 4
16.05.2024, 14:38 5
Цитата Сообщение от Катафалк Посмотреть сообщение
выкиньте EF в помойку и используйте нормальный SQL, который и был создан для работы с БД.
Если нормально знать SQL, уметь анализировать то что генерирует EF, править LINQ так как нужно, то можно прекрасно и с ним работать... Но гораздо проще SqlCommand + SQL, хоть и писанины больше...
0
Эксперт .NET
12286 / 8638 / 1307
Регистрация: 21.01.2016
Сообщений: 32,504
16.05.2024, 15:27 6
Цитата Сообщение от Катафалк Посмотреть сообщение
Типичная проблема со всеми ОРМ.
Типичная проблема незнания инструмента, с которым работаешь. ОРМ тут ничем не отличается от перфоратора или скальпеля. Не надо проецировать свои неудачи и некомпетентность на то, на что не хватило ума осилить.
1
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,793
16.05.2024, 16:38 7
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Если нормально знать SQL, уметь анализировать то что генерирует EF, править LINQ так как нужно, то можно прекрасно и с ним работать... Но гораздо проще SqlCommand + SQL, хоть и писанины больше...
Осталось только понять, зачем анализировать весь этот мусор генерируемый EF и LINQ, если нормально знаешь SQL. Гораздо проще написать SQL тогда. ОРМ - инструмент для вебоговнокодеров, не осиливших нормальное программирование для БД.
Цитата Сообщение от Usaga Посмотреть сообщение
Типичная проблема незнания инструмента, с которым работаешь. ОРМ тут ничем не отличается от перфоратора или скальпеля. Не надо проецировать свои неудачи и некомпетентность на то, на что не хватило ума осилить.
Только вот перфоратор и скальпель полезные инструменты и без них не обойтись в определенных задачах, ну или гораздо сложнее без них чем с ними. С ОРМ же все наоборот - это излишнее усложнение, без которого обойтись гораздо легче, чем с ним. Но т.к. вебоговнокодеров которые не умеют писать нормальный код наплодили выше гор, вот и приходится для них создавать бессмысленные инструменты на замену отстутствующей головы на плечах.
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,406
17.05.2024, 21:50 8
Цитата Сообщение от Катафалк Посмотреть сообщение
Гораздо проще написать SQL тогда. ОРМ - инструмент для вебоговнокодеров, не осиливших нормальное программирование для БД.
сильное заявление
1
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,793
17.05.2024, 22:01 9
Цитата Сообщение от Dr9vik Посмотреть сообщение
сильное заявление
Истинно так. А главное - правдивое.
0
1517 / 908 / 328
Регистрация: 17.05.2015
Сообщений: 3,428
19.05.2024, 14:08 10
Цитата Сообщение от Катафалк Посмотреть сообщение
зачем анализировать весь этот мусор генерируемый EF и LINQ, если нормально знаешь SQL. Гораздо проще написать SQL тогда. ОРМ - инструмент для вебоговнокодеров, не осиливших нормальное программирование для БД.
весь С# - инструмент для говнокодеров, не осиливших нормальное программирование на ассамблере
2
2314 / 1799 / 748
Регистрация: 27.07.2012
Сообщений: 5,326
20.05.2024, 09:34 11
Ассемблер для слабаков, которые не понимают всей красоты перфокарт. То потеряное чувство, когда программу можно было потрогать..
3
2643 / 1902 / 356
Регистрация: 14.08.2018
Сообщений: 6,133
Записей в блоге: 4
20.05.2024, 09:36 12
Цитата Сообщение от John Prick Посмотреть сообщение
всей красоты перфокарт
Там ещё перфоленты были. Вот тут уже и вес программы чувствовался
1
2643 / 1902 / 356
Регистрация: 14.08.2018
Сообщений: 6,133
Записей в блоге: 4
20.05.2024, 09:41 13
Entity framework добавляет сущность, когда этого не просили

Entity framework добавляет сущность, когда этого не просили

1
2314 / 1799 / 748
Регистрация: 27.07.2012
Сообщений: 5,326
20.05.2024, 09:47 14
Ну красота же!
1
Эксперт .NET
12286 / 8638 / 1307
Регистрация: 21.01.2016
Сообщений: 32,504
24.05.2024, 07:55 15
Цитата Сообщение от Катафалк Посмотреть сообщение
С ОРМ же все наоборот - это излишнее усложнение, без которого обойтись гораздо легче, чем с ним.
Это усложнение только для людей, которые его не осилили и везде ноют, что это "усложнение". То, что тебе обойтись без ОРМ проще я не спорю. А вот те, кто осилил, могут переиспользовать куски запросов и стряпать весьма замороченные запросы, которые ты на голом SQL без Dynamic SQL замучаешься писать...
1
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,793
24.05.2024, 11:46 16
Цитата Сообщение от Usaga Посмотреть сообщение
А вот те, кто осилил, могут переиспользовать куски запросов и стряпать весьма замороченные запросы, которые ты на голом SQL без Dynamic SQL замучаешься писать...
Уровень "осиления" ОРМа измеряется отношением к нему. А именно, тот кто не осилил - яростно их нахваливает, ибо просто не сталкивался с проектами такого масштаба где от ОРМов начинаются одни проблемы и проще отказаться. Но если клипать типовые круды, то конечно, можно сказать "осилили".
Ну а тот кто действительно осилил, разобрался со всеми кейсами и ограничениями, тот понимает, что краткосрочная выгода от того что можно что то там быстро состряпать ниразу не перекрывает долгосрочные издержки поддержки проекта. Ибо рано или поздно придётся его оттуда выкорчёвывать, если конечно проект раньше не загнётся.
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,406
24.05.2024, 11:59 17
Цитата Сообщение от Катафалк Посмотреть сообщение
Но если клипать типовые круды
99% проектов имеют типовые круды
Цитата Сообщение от Катафалк Посмотреть сообщение
Ибо рано или поздно придётся его оттуда выкорчёвывать
зачем выкорчевывать то что работает? и кто мешает написать функции в базе и к ним потом обращаться через орм, если там такие очень уже сложные скл запросы
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,793
24.05.2024, 12:58 18
Цитата Сообщение от Dr9vik Посмотреть сообщение
99% проектов имеют типовые круды
Ну да, написанные 100% вебоговнокодерами. Но зачем на них равняться?
Цитата Сообщение от Dr9vik Посмотреть сообщение
зачем выкорчевывать то что работает? и кто мешает написать функции в базе и к ним потом обращаться через орм, если там такие очень уже сложные скл запросы
Ничто не мешает. Вопрос тут обратный. Что мешает сразу делать нормально, а не через ОРМ?
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,406
24.05.2024, 13:23 19
Цитата Сообщение от Катафалк Посмотреть сообщение
Ну да, написанные 100% вебоговнокодерами. Но зачем на них равняться?
им плотят и они работают
Цитата Сообщение от Катафалк Посмотреть сообщение
делать нормально
нормально это как?
орм не более прослойка и там тот же скл
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,793
24.05.2024, 13:34 20
Цитата Сообщение от Dr9vik Посмотреть сообщение
орм не более прослойка и там тот же скл
Именно. Ограниченная и бессмысленная прослойка, от которой вреда в целом больше чем пользы. Так зачем она нужна, если уже есть SQL? Аналогия с ассемблером от клоунов выше тут не работает, ибо это точно такой же высокоуровневый язык.
0
24.05.2024, 13:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2024, 13:34
Помогаю со студенческими работами здесь

В чем разница между Entity Framework и Entity Framework Core?
В чем разница (если она есть) между entity framework и entity framework core?

Entity Framework. Удаление entity без удаления связей
Вечер добрый. Есть модель Coder First. Каскадное удаление запрещено. Удаление произвожу так: ...

Entity Framework 6
Нарисовалась неожиданная проблемка. Штудирую Троелсена, там описание Framework 4, у меня 6-я...

Entity framework One vs Zero-or-One
При настройке ассоциаций между двумя сущностями можно выбрать чтобы на конце связь была &quot;один&quot; и...

Entity Framework
Здравствуйте, есть проблема с Entity Framework, как источник данных я указал объекты созданные...

Entity Framework
Доброго времени суток. Столкнулся с такой проблемой. Сохраняю запись в таблицу базы MySQL, а мне...

Entity Framework
Здравствуйте, пока только начал работать с C# WPF и EF. Возникла такая проблема, я создал базу в MS...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru