Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для Титан_1
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,076

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

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

Студворк — интернет-сервис помощи студентам
В комментариях описан текущих ход событий тестового прогона, а не общий случай
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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2024, 15:48
Ответы с готовыми решениями:

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

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

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

23
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
24.05.2024, 13:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Катафалк Посмотреть сообщение
от которой вреда в целом больше чем пользы
в чем вред?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
24.05.2024, 14:07
Думаю, сторонников ORM и их противников примерно одинаковое кол-во. Использование их, как правило, диктует стиль конкретной компании, а не желание отдельных людей. Какой смысл спорить что "портит", что "не портит" - если в компании EF юзается уже 10+ лет, то чье-то мнение "давайте перейдем на SQL" - будет в лучшем случае проигнорировано. И придется "втыкать" в него, хочешь не хочешь. На фреймворках сидят 99,9% компаний. Мало кто использует "чистый" код в наше время.
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,020
25.05.2024, 19:22
Цитата Сообщение от Dr9vik Посмотреть сообщение
в чем вред?
В том, что это усложняет и замедляет разработку сложного проекта. Во первых, ОРМ это чёрный ящик, в котором вы никогда не можете быть уверены, какой именно результирующий SQL он сгенерировал. И если вам нужно оптимизировать запрос, то нужно его явно проверять и при необходимости исправлять. А если нужно проверять - то в чем смысл? Просто напишите SQl и всё будет абсолютно прозрачно.
Во-вторых, если вдруг вам потребуются какие-то СУБД-специфичные возможности, которые ОРМ не поддерживает - у вас вообще никаких вариантов кроме ручного написания кода. Что приводит к нарушению унификации, часть будет на ОРМе, часть на SQL, в итоге - усложнение кодовой базы. А зачем, если можно писать SQL?
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
25.05.2024, 21:44
Цитата Сообщение от Катафалк Посмотреть сообщение
В том, что это усложняет и замедляет разработку сложного проекта.
у меня в проекте 100 сущностей
я что должен нанаписать 100 скл getById?
не норкоманте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2024, 21:44

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. Сразу отвечу: А в PvP с ним. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru