【问题标题】:EntityFramework Update with one roundtrip to the database一次往返数据库的实体框架更新
【发布时间】:2018-01-29 06:03:59
【问题描述】:

我有一张如下表:

联系人:

| Id | Name  | Age |
|----|-------|-----|
| 1  | amir  | 35  |
| 2  | steve | 29  |

还有POCO实体(分离实体)如下:

var contacts = new [] {
                        Contact {Id = 1, Age = 34},
                        Contact {Id = 2, Age = 25}
                       };

然后:

using (var ctx = new ApplicationDbContext())
{
    ctx.Contacts.Update(contacts);
    ctx.SaveChanges();
}

通过实体框架(代码优先)使用一个往返数据库更新第一次提到的表行的最佳做法是什么?
注意:我只想更新年龄列。

【问题讨论】:

    标签: c# entity-framework entity-framework-6


    【解决方案1】:

    EF Core 支持批处理,如果您将其批处理大小设置为 1,您将获得与 EF 6.x 相同的结果

    optionsBuilder.UseSqlServer(
       @"Server=(localdb)\mssqllocaldb;Database=Demo.Batching;Trusted_Connection=True;",
       options => options.MaxBatchSize(1)
    );
    

    这意味着您应该开始使用 EF Core 而不是 EF 6.x,如果您希望减少到数据库的往返次数以进行插入/更新/删除,或者您应该使用支持 BulkUpdate 的 3dr 方库,例如 @ 987654321@

    【讨论】:

    • ctx.Contacts.Where(x => x.Id == 1).Update(x => new Contact { Age = 34});ctx.Contacts.Where(x => x.Id == 2).Update(x => new Contact { Age = 25}); ctx.SaveChanges(); EF-Plus 是否正确?
    • 它的更新方法有一个batchsize参数.Update(x => ..., update => { update.BatchDelayInterval = 50; update.BatchSize = 5; })。这对于范围更新很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多