【发布时间】:2021-09-03 19:28:07
【问题描述】:
我的问题:是什么决定了调用 DbContext.SaveChanges() 方法的速度(性能)?将所有 DbSet 放在一个 DbContext 中是不是一种不好的做法?
我有一个c#/WPF/MS SQL Server/Entity Framework Core项目,其实是针对我公司批发业务的。
我实现了一个包含数十个 DbSet 的单个 DbContext,当然,每个 DbSet 代表数据库中的一个表。大约有 10 个主要的表,分别代表订单、订单详细信息、客户、产品等,每个主要的 DbSet/表都包含大约 50,000 到 150,000 条记录。问题是当调用 DbContext.SaveChanges 方法时,它需要超过 9,000 毫秒(9 秒)才能执行!我将所有 DbSet 放在同一个 DbContext 中。这是一个坏习惯和速度慢的原因吗?
为了测试,我创建了一个单独的 DbContext 并且只在其中放置了一个 DbSet。 DbSet 有大约 100,000 条记录,但为此调用 SaveChanges 大约需要 500 毫秒,这是一个显着的改进。
鉴于我的情况,数据库性能的最佳实践是什么?请帮忙。
public class MyDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies().UseSqlServer(DbConn.GetConnStr());
base.OnConfiguring(optionsBuilder);
}
public DbSet<Order> Orders { get; set; } // This has 100k+ records.
public DbSet<OrderDetail> OrderDetails { get; set; } // This has 150k+ records.
public DbSet<Ship> Ships { get; set; } // 100k+ records
public DbSet<ShipDetail> ShipDetails { get; set; } // 150k+ records
public DbSet<Customer> Customers { get; set; } // 100k records
public DbSet<Product> Products { get; set; } // 10k+ records
public DbSet<ProductStock> ProductStocks { get; set; }
public DbSet<ProductPrice> ProductPrices { get; set; }
public DbSet<PriceType> PriceTypes { get; set; }
public DbSet<Claim> Claims { get; set; }
public DbSet<Carrier> Carriers { get; set; }
public DbSet<Channel> Channels { get; set; }
public DbSet<Import> Imports { get; set; }
public DbSet<ImportDetail> ImportDetails { get; set; }
}
【问题讨论】:
-
DbSet 的数量无关紧要。上下文的生命周期和您加载到其中的数据量。也许您应该提供有关这些指标的更多详细信息。
-
我在启动时创建了一个 DbContext 实例,然后将它传递给所有类和对象。我在申请期间使用它。这会是它慢的原因吗?
-
是的,当然。
-
阅读:The DbContext lifetime。 DbContext 的生命周期应该很短。
标签: sql-server entity-framework-core