2

可能重复:
如何更新记录而不在 ADO.NET 实体框架中再次选择该记录?

我正在开发一个 Windows 应用程序,我需要在网格中显示对象列表及其子对象。因此用户可以修改从实体框架中检索到的实体。

在更新数据库中的对象时,看起来需要从数据库中检索对象并分配新值。这可能会导致性能问题。有解决办法吗?

    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();
        }
4

1 回答 1

8

一个很好的方法是使用我称之为虚拟实体的东西。这是当您将一个假实体附加到图形中时,其中只有一个键。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();

您要确保在新的上下文中执行此操作,因为如果该实体已被上下文跟踪,则附加将出错。

于 2012-09-21T10:21:50.307 回答