可能重复:
How to update a record without selecting that record again in ADO.NET Entity Framework?
我正在开发一个Windows应用程序,我需要在网格中显示对象及其子项列表。所以用户可以修改从实体框架中检索的实体。
在更新db中的对象时,看起来需要从db检索对象并分配新值。这可能会导致性能问题。有解决方法吗?
public class Vehicle
{
public Vehicle()
{
this.Fillups = new List<FillupEntry>();
this.Reminders = new List<Reminder>();
}
public int VehicleId { get; set; }
public int UserId { get; set; }
public string Name { get; set; }
public string ModelName { get; set; }
public ICollection<FillupEntry> Fillups { get; set; }
public ICollection<Reminder> Reminders { get; set; }
}
public void Update(Vehicle updatedVehicle)
{
Vehicle vehicleToUpdate =
this.GetDbSet<Vehicle>()
.Where(v => v.VehicleId == updatedVehicle.VehicleId)
.First();
vehicleToUpdate.Name = updatedVehicle.Name;
vehicleToUpdate.Year = updatedVehicle.Year;
vehicleToUpdate.MakeName = updatedVehicle.MakeName;
vehicleToUpdate.ModelName = updatedVehicle.ModelName;
vehicleToUpdate.SortOrder = updatedVehicle.SortOrder;
vehicleToUpdate.PhotoId = updatedVehicle.PhotoId;
this.SetEntityState(vehicleToUpdate, vehicleToUpdate.VehicleId == 0
? EntityState.Added
: EntityState.Modified);
this.UnitOfWork.SaveChanges();
}
答案 0 :(得分:7)
这样做的好方法是使用虚拟实体。这是当您仅使用密钥附加图表的虚假授权时。 EF将仅更新您在更新呼叫后设置的道具。
所以在你的例子中:
Vehicle vehicleToUpdate = new Vehicle { VehicleId = updatedVehicle.VehicleId};
context.Vehicles.Attach(vehicleToUpdate);
vehicleToUpdate.Name = updatedVehicle.Name;
vehicleToUpdate.Year = updatedVehicle.Year;
vehicleToUpdate.MakeName = updatedVehicle.MakeName;
vehicleToUpdate.ModelName = updatedVehicle.ModelName;
vehicleToUpdate.SortOrder = updatedVehicle.SortOrder;
vehicleToUpdate.PhotoId = updatedVehicle.PhotoId;
context.SaveChanges();
您希望确保在新的上下文中执行此操作,因为如果实体已被上下文跟踪,则附加将会出错。