我正在尝试使用实体框架更新多个记录,但我不确定如何继续。
基本设置:
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进行此类更新吗?它是否直接转换为实体框架(核心)?
答案 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();
}
. . .
这将仅更新单个交易中所有这些约会的已更改列。