【问题标题】:how to delete multiple rows of data with linq to EF using DbContext如何使用 DbContext 使用 linq to EF 删除多行数据
【发布时间】:2012-04-18 16:53:54
【问题描述】:

在一个项目中,我有一个包含以下列的数据库表

我希望能够从该表中删除所有可以传入的具有匹配的 SharingAgencyId 和 ReceivingAgencyId 值的行。

到目前为止我所尝试的:

 public static ICollection<SecurityDataShare> UpdateSharedEntites(long conAgency, long recAgency)
        {
            ICollection<SecurityDataShare> agShares = null;
            try
            {
                using (var context = new ProjSecurityEntities(string.Empty))
                {
                    agShares = (from a in context.SecurityDataShares
                               .Where(c => c.ReceivingAgencyId == recAgency && c.SharingAgencyId == conAgency)
                                select a); 
                }
            }
            catch (Exception ex)
            {
                //ToDo
                throw;
            }
        }

我的想法是检索 id 与传入参数匹配的记录,然后使用 foreach 循环遍历 (agShare) 并删除每一行,然后保存我的更改。在当前的实现中,我似乎无法访问任何 Delete 方法。

看看上面的例子,我很感激有关如何使用 dbContext 删除表中包含值 43 和 39 的行的任何建议。

干杯

【问题讨论】:

  • context.SecurityDataShares 上是否有任何 Delete 或 Remove 方法?
  • SecurityDataShares 上有一个 Remove 方法,但这看起来好像删除了实体表而不是实体本身 示例:context.SecurityDatShares.Remove();

标签: linq entity-framework


【解决方案1】:

如果我理解正确,您的DbContext 的属性,如SecurityDataShares 应输入为IDbSet&lt;SecurityDataShare&gt;。如果正确,您应该可以使用this Remove method

foreach(var agShare in agShares) {
    context.SecurityDataShares.Remove(agShare);
}
context.SaveChanges();

请注意,这会创建一个单独的 SQL 语句来删除这些对象。如果您预计对象的数量会很大,您可能希望使用存储过程。

【讨论】:

  • 就是这样。我误读了该方法的定义。也感谢关于 SP 的提示。
  • 请注意,使用 Entity Framework 一次删除数百、数千或更多行(.Remove(); .Remove(); .SaveChanges();.Remove(); .SaveChanges(); .Remove(); .SaveChanges();)默认情况下会汇总事务中的所有删除,这意味着它可能需要相当长的时间并可能导致 commandTimeout。
  • @ErikPhilips:是的,正如我所说,如果您期望有大量对象,存储过程可能会在一个语句中删除所有元素。如果这不起作用,我建议将这些项目分组并在每百次左右更改后保存。虽然在每个 .Remove() 之后调用 .SaveChanges() 可以防止 SQL 超时,但它也会花费很多很多时间,因为您将有 N 个数据库往返。此外,在将事物分解为单独的事务之前,您必须考虑如果仅删除部分项目,系统是否会处于正确状态。
【解决方案2】:

Entity Framework 无法轻松运行单个命令来删除多行(据我所知)。我的偏好是直接为多实体更新/删除运行 SQL 语句using native sql with the dbcontext of sorts

【讨论】:

    【解决方案3】:

    您还可以将数据表传递给存储过程,其中数据库包含您类型的动态类型表和 将该表用于存储过程,以从数据库表中删除匹配的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多