Entity framework удаляет все строки вместо одной

Я застрял на небольшой проблеме. Я хочу удалить одну строку на основе идентификатора. Но вместо этого я продолжаю удалять все свои строки.

Это мой код в моем слое данных. Слово «эигенаар» можно прочитать как «владелец».

public void removeEigenaar(int eigenaarID)
    {
        transaction = connection.BeginTransaction();
        try
        {
            using (context = new MyDbContext(connection, false))
            {
                context.Database.Log = (string message) => { Console.WriteLine(message); };
                context.Database.UseTransaction(transaction);
                //----------------------------

                Eigenaar e =
                    (from s in context.Eigenaars
                     where s.ID == eigenaarID
                     select s).First();
                context.Eigenaars.Remove(e);

                //----------------------------
                context.SaveChanges();
            }
            transaction.Commit();
        }
        catch
        {
            transaction.Rollback();
            throw;
        }
    }

Если я отлаживаю код, я вижу, что моя «е» заполнена одним владельцем. Вот что мне так странно.

редактировать sql

Мой запрос на удаление работает, он просто очень много удаляет.

Боковой совет: если вы ожидаете одного результата, используйте .Single() вместо .First(), чтобы избавиться от головной боли позже.

Joe Phillips 23.04.2018 16:58

Кроме того, почему вы используете s в качестве имени переменной в операторе linq? Разве e не имеет больше смысла?

Joe Phillips 23.04.2018 16:59

Какой здесь SQL запускается? Вы распечатываете его, поэтому разобраться в нем будет тривиально.

DavidG 23.04.2018 17:00

Я использую mysql, если вы об этом спрашиваете

ToonDoe 23.04.2018 17:04

Нет, что на самом деле выполняется SQL?

DavidG 23.04.2018 17:05

Объявлено ли свойство Id как первичный ключ или другое свойство является первичным ключом и используется всеми другими записями с одним значением?

Chrᴉz supports Monica 23.04.2018 17:06

Какая же это версия ef?

Joe Phillips 23.04.2018 17:07

EF 6.0, мой идентификатор фактически мой ключ. Но я тестировал строку, которая не была моим ключом. И он продолжает удалять все мои строки.

ToonDoe 23.04.2018 17:09

Если вы не предоставите дополнительную информацию, я буду вынужден проголосовать, чтобы закрыть этот вопрос, поскольку он не имеет минимальный воспроизводимый пример. Можете ли вы хотя бы сказать нам, каков на самом деле исполняемый код SQL? Я про то, что похоже на DELETE FROM SomeTable.....

DavidG 23.04.2018 17:16

нет, я не использую код sql. Я просто сначала использую код EF

ToonDoe 23.04.2018 17:18

Да, но EF переведет это в SQL, который вы выводите с помощью метода Console.WriteLine(message).

DavidG 23.04.2018 17:19

о, хорошо, я посмотрю

ToonDoe 23.04.2018 17:20

Я добавил это в свой вопрос

ToonDoe 23.04.2018 17:26

Удалил ли он 4 строки? Трудно сказать, основываясь на результатах. Если это так, вам действительно стоит изменить это .First () на .Single (). Я подозреваю, что у вас есть несколько записей в базе данных с одним и тем же идентификатором. Если этого не ожидать, то .Single () спас бы вас здесь.

Joe Phillips 23.04.2018 17:29

Я добавил сингл, но это не решило мою проблему. И можно ли вообще сделать таблицу mysql с дублированными ключами?

ToonDoe 23.04.2018 17:33

Вы говорите «ключ», но это неоднозначно. Первичные ключи должны быть уникальными, а «ключи» - нет ...

Joe Phillips 23.04.2018 17:34

Я уверен, что дубликатов ключей нет. моя проблема связана с моим контекстом?

ToonDoe 23.04.2018 17:39

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

Joe Phillips 23.04.2018 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
18
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте добавить:

context.Entry(e).State = EntityState.Modified;

перед

context.SaveChanges();

да, одну минуту

ToonDoe 23.04.2018 17:29

К вашему сведению, я не думаю, что это связано

Joe Phillips 23.04.2018 17:30

Это очень странно. Добавление вашего кода делает все мои значения в моей таблице одинаковыми. Ничего не удаляется, но все остальные строки меняются в той строке, которую я хотел удалить.

ToonDoe 23.04.2018 17:31

Попробуйте context.Entry (e) .State = EntityState.Deleted;

Sushrut Kanetkar 23.04.2018 17:34

Это уже было отправлено как ответ, проголосовано против, а затем удалено.

Reinstate Monica Cellio 23.04.2018 17:35
Ответ принят как подходящий

Нашел проблему.

В моем mydbcontext.cs я добавил:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Eigenaar>().MapToStoredProcedures();
        modelBuilder.Entity<Eigendom>().MapToStoredProcedures();
        modelBuilder.Entity<Eigenschap>().MapToStoredProcedures();
        modelBuilder.Entity<Overeenkomst>().MapToStoredProcedures();
        modelBuilder.Entity<Panden_has_eigenschappen>().MapToStoredProcedures();
    }

Удаление этого кода исправило его.

Некоторая модификация вашего кода:

IEnumerable<Eigenaar> e= (from s in context.Eigenaars
                 where s.ID == eigenaarID
                 select s).ToList();    
context.Eigenaars.DeleteAllOnSubmit(e);
context.SubmitChanges();

ИЛИ ЖЕ

Вы можете выполнить обычную команду усечения или удаления SQL, используя метод DataContext.ExecuteCommand:

context.ExecuteCommand("DELETE FROM Entity");

Или же

context.ExecuteCommand("TRUNCATE TABLE Entity");

Другие вопросы по теме