Я застрял на небольшой проблеме. Я хочу удалить одну строку на основе идентификатора. Но вместо этого я продолжаю удалять все свои строки.
Это мой код в моем слое данных. Слово «эигенаар» можно прочитать как «владелец».
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
Мой запрос на удаление работает, он просто очень много удаляет.
Кроме того, почему вы используете s в качестве имени переменной в операторе linq? Разве e не имеет больше смысла?
Какой здесь SQL запускается? Вы распечатываете его, поэтому разобраться в нем будет тривиально.
Я использую mysql, если вы об этом спрашиваете
Нет, что на самом деле выполняется SQL?
Объявлено ли свойство Id как первичный ключ или другое свойство является первичным ключом и используется всеми другими записями с одним значением?
Какая же это версия ef?
EF 6.0, мой идентификатор фактически мой ключ. Но я тестировал строку, которая не была моим ключом. И он продолжает удалять все мои строки.
Если вы не предоставите дополнительную информацию, я буду вынужден проголосовать, чтобы закрыть этот вопрос, поскольку он не имеет минимальный воспроизводимый пример. Можете ли вы хотя бы сказать нам, каков на самом деле исполняемый код SQL? Я про то, что похоже на DELETE FROM SomeTable.....
нет, я не использую код sql. Я просто сначала использую код EF
Да, но EF переведет это в SQL, который вы выводите с помощью метода Console.WriteLine(message).
о, хорошо, я посмотрю
Я добавил это в свой вопрос
Удалил ли он 4 строки? Трудно сказать, основываясь на результатах. Если это так, вам действительно стоит изменить это .First () на .Single (). Я подозреваю, что у вас есть несколько записей в базе данных с одним и тем же идентификатором. Если этого не ожидать, то .Single () спас бы вас здесь.
Я добавил сингл, но это не решило мою проблему. И можно ли вообще сделать таблицу mysql с дублированными ключами?
Вы говорите «ключ», но это неоднозначно. Первичные ключи должны быть уникальными, а «ключи» - нет ...
Я уверен, что дубликатов ключей нет. моя проблема связана с моим контекстом?
Понятия не имею. Я полагаю, вам нужно предоставить гораздо больше информации. Поскольку он настолько открытый, вам нужно сузить круг проблемы и, скорее всего, задать новый вопрос. Этот, кажется, никуда не денется





Попробуйте добавить:
context.Entry(e).State = EntityState.Modified;
перед
context.SaveChanges();
да, одну минуту
К вашему сведению, я не думаю, что это связано
Это очень странно. Добавление вашего кода делает все мои значения в моей таблице одинаковыми. Ничего не удаляется, но все остальные строки меняются в той строке, которую я хотел удалить.
Попробуйте context.Entry (e) .State = EntityState.Deleted;
Это уже было отправлено как ответ, проголосовано против, а затем удалено.
Нашел проблему.
В моем 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");
Боковой совет: если вы ожидаете одного результата, используйте
.Single()вместо.First(), чтобы избавиться от головной боли позже.