实体框架使用join更新多个记录

时间:2018-02-08 20:03:47

标签: entity-framework linq entity-framework-core

我正在尝试使用实体框架更新多个记录,但我不确定如何继续。

基本设置:

class Appointment
{
    public int Id {get; set;}
    public double Charge {get; set;}
    public DateTime Time {get; set;}
}

视图显示约会列表,然后调用控制器Post动作传递到Ienumerable<Appointment>

public async Task<int> UpdateAppointments(IEnumerable<Appointment> appointments){
    // code goes here
    var appointmentsToUpdate = await _context
           .Appointments
           .Where(a => a.time > DateTime.Now).ToListAsync();

    // what to do here??
    // loop through appointmentsToUpdate and find the relevant 
    // record inside appointment, and then do an update? 
    // Seems like a merge would be more efficient.

}

我想要做的是合并约会和约会ToUpdate并更新约会时间。在另一种情况下,使用不同的授权,我希望管理员只能更改约会费用,因此删除所有记录并附加新记录不是一种选择。

看起来您可以使用纯sql语句执行此操作,但是appointments参数作为IEnumerable传入,而不是像数据库中已经存在的表一样传递:Bulk Record Update with SQL < / p>

首先,您可以使用Linq进行此类更新吗?它是否直接转换为实体框架(核心)?

1 个答案:

答案 0 :(得分:2)

如果没有扩展项目或存储SQL,您可以做的最好的事情是将约会作为未更改的实体附加,并将目标属性标记为已修改。

您附加的约会只需要填充密钥属性和时间。

像这样:

class Db : DbContext
{

    public DbSet<Appointment> Appointments { get; set; }

    public void UpdateAppointmentTimes(IEnumerable<Appointment> appointments)
    {
        foreach(var a in appointments)
        {
            this.Appointments.Attach(a);
            this.Entry(a).Property(p => p.Time).IsModified = true;
        }
        this.SaveChanges();
    }
     . . .

这将仅更新单个交易中所有这些约会的已更改列。