用Entity Framework替代ADO.NET。对于以下场景,Entity Framework是否合适?

3

问题1:在多用户环境中,我们应该使用Entity Framework来实现对表格进行多次更新(100行)的功能吗?

问题2:在以下情况下,我们是否做出了正确的决策来使用EF?

场景:库存计数网页包含一个可编辑的网格视图控件,允许用户每次更新100行。

背景:库存计数用于记录期末库存数量。所有组织的期末关闭时间均为星期一。大约有10个正在使用的组织,每个组织平均至少有100个以上的站点在同一时间进行库存关闭。

基于ADO.NET的类似屏幕运作良好。但是团队正在尝试在新屏幕上引入Entity Framework。我们进行了方法级压力测试,并没有得到令人满意的EF结果。我们运行了测试2分钟,并模拟了从5个用户到35个用户的负载。

以下是结果:

ADO.NET 使用存储过程逐一进行一次数据库更新。

5 Users - Number of test per second per user - 80
35 Users - Number of test per second per user - 150

EF使用SaveChanges()方法,该方法逐一更新数据库。

5 Users - Number of test per second per user - 43
35 Users  - Number of test per second per user - 43

EF代码:

方法1

context.Configuration.AutoDetectChangesEnabled = false;
context.Set<LocationData>().AddRange(data); //data is a collection of LocationData
foreach (var locationData in data)
{
    var entry = context.Entry(locationData);
    entry.State = EntityState.Modified;
}
context.SaveChanges();

方法1的代码分析器详细信息

在此输入图片描述

方法2

context.Configuration.AutoDetectChangesEnabled = false;
foreach (var locationData in data)
{
    context.Set<LocationData>().Attach(data); 
    var entry = context.Entry(locationData);
    entry.State = EntityState.Modified;
}
context.SaveChanges();

第二种方法的代码分析器细节

图片描述

由Entity Framework生成的SQL查询

exec sp_executesql N'
UPDATE [dbo].[LocationData]
SET [LocationId] = @0, [ClientId] = @1, [ProductId] = @2, 
[SupplierProductId] = @3, [MenuId] = @4, [MenuNumber] = @5, [CaskNumber] = @6
WHERE ([Id] = @7)',N'@0 bigint,@1 bigint,@2 bigint,@3 bigint,@4 bigint, @5 bigint,@6 nvarchar(64),@7 bigint',
@0=22371851,@1=22371851,@2=22371851,@3=22371851,@4=22371851,@5=22371851,@6=N'Cask0091',@7=22371851

由ADO.NET生成的SQL查询

Update LocationData
set 
 LocationId = @LocationId, 
 ClientId= @ClientID,  
 ProductId= @ProductId, 
 SupplierProductId=@SupplierProductId,  MenuId= @MenuId, 
 MenuNumber= @MenuNumber, 
 CaskNumber= @CaskNumber
WHERE   LocationData.Id = @Id

这些测试并没有在事务下执行。

我在开发过程中使用了以下工具:Visual Studio 2012 Ultimate、Sql Server R2、Entity Framework 6.0.2、.NET 4.5和C#。

1个回答

1
不是的。Entity Framework简化了大型模型架构,并自动生成SQL来处理复杂的部分。如果你只是使用EF进行简单的读写操作,最好使用ADO.NET。如果你想标准化和简化一组开发人员使用SQL Server的方式,应该使用Entity Framework。

我理解EF的目的以及它提供的功能。我正在一个高流量网站上使用它,多个用户将更新或插入数据。然而,我不明白你所说的EF不适用于简单的读写操作是什么意思。如果添加或更新数据,系统最终会执行插入或更新操作。无论使用何种技术,数据库更新都将通过简单的插入或更新操作进行。 - Amit Rai Sharma
我已经在问题中包含了EF生成的SQL。 - Amit Rai Sharma
啊,sp_executesql是你的瓶颈。它会降低性能。可能有一些选项可以添加到查询中以加快速度,但我不知道如何在EF中实现。尽管sp_executesql执行时间可能较长,但根据我阅读的一些文章,它可能更有效率。回答你的问题,EF只是一个框架,用于标准化SQL的使用,并在许多情况下进行扩展,例如OData。如果你真的需要速度,还有其他直接扩展ADO.NET的框架可用,例如XPO。 - user817530
可以,只要进行一些调整。但是默认情况下,我会说不行。 - user817530
我已经关闭了更改跟踪,使用预编译视图。然而,我可以说EF没有足够的优化来处理中高流量站点中的多个更新语句。 - Amit Rai Sharma
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接