【问题标题】:Entity framework removes all rows instead of one实体框架删除所有行而不是一个
【发布时间】:2018-04-23 14:57:04
【问题描述】:

我遇到了一个小问题。我想根据 ID 删除一行。但我一直在删除我所有的行。

这是我的数据层中的代码。您可以将“eigenaar”一词读作“所有者”。

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;
        }
    }

如果我调试代码,我可以看到我的“e”被一个所有者填充。这就是我觉得很奇怪的地方。

编辑 sql

我的删除查询有效,它只是删除了很多。

【问题讨论】:

  • 小贴士:如果您希望返回一个结果,请使用 .Single() 而不是 .First() 以节省以后的麻烦
  • 另外,为什么在 linq 语句中使用s 作为变量名? e 不是更有意义吗?
  • 这里运行的 SQL 是什么?您正在打印它,所以它应该很容易弄清楚。
  • 如果这就是你的要求,我使用 mysql
  • 不,实际执行的 SQL 是什么?

标签: c# mysql entity-framework dbcontext


【解决方案1】:

尝试添加:

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

之前

context.SaveChanges();

【讨论】:

  • 是的,一分钟
  • 仅供参考,我认为这无关
  • 这很奇怪。添加您的代码使我的表中的所有值都相同。没有任何内容被删除,但我想要删除的行中的所有其他行都发生了变化。
  • 试试 context.Entry(e).State = EntityState.Deleted;
  • 这已作为答案发布,投反对票,然后删除。
【解决方案2】:

发现问题。

在 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();
    }

删除此代码修复它。

【讨论】:

    【解决方案3】:

    您的代码的一些修改:

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

    您可以使用 DataContext.ExecuteCommand 方法执行普通的 SQL 截断或删除命令:

    context.ExecuteCommand("DELETE FROM Entity");
    

    或者

    context.ExecuteCommand("TRUNCATE TABLE Entity");
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2014-08-21
      • 2013-02-19
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      相关资源
      最近更新 更多