1

我知道要更新 EF 中的对象,我可以执行类似...

var hotel = context.Hotels.SingleOrDefault(u => u.HotelID == editedHotel.HotelID);
    hotel.Name= editedHotel.Name;
    hotel.Address = editedHotel.Address;
    hotel.RoomCount = editedHotel.RoomCount;
context.SaveChanges();

但是如果很多字段需要更新,这会变得很长。

有没有办法我可以做类似...

    var hotel = context.Hotels.SingleOrDefault(u => u.HotelID == editedHotel.HotelID);
hotel = editedHotel;
context.SaveChanges();

...所以所有字段都可以一次性更改?

4

3 回答 3

3

我想你可能想研究一下 AutoMapper 之类的东西。

但是,如果您覆盖对 的引用hotel,您实际上会丢失 EF 为您执行的跟踪。

于 2012-10-26T16:47:15.007 回答
3

怎么样...

var cachedHotel = context.Hotels.Local
    .FirstOrDefault(h => h.id = editedHotel.id);
if (cachedHotel != null)
{
  context.Hotels.Detach(cachedHotel);
}
context.Hotels.Attach(editedHotel);
context.Entry(editedHotel).State = System.Data.EntityState.Modified;
context.SaveChanges();
于 2012-10-26T16:51:20.110 回答
1

您可以使用/编写一个克隆方法,该方法使用反射将值从一个对象应用到另一个对象。

或者,您可以向 Hotel 类添加一个方法,该方法采用酒店对象并应用值,例如:

public void Apply(Hotel h)
{
    this.Name = h.Name;
    this.Address = h.Address;
    this.RoomCount = h.RoomCount;
}

然后你的代码变成:

var hotel = context.Hotels.SingleOrDefault(u => u.HotelID == editedHotel.HotelID);
    hotel.Apply(editedHotel);
context.SaveChanges();
于 2012-10-26T16:47:58.750 回答