我已经进行了一些搜索,并且我了解这是出于安全原因,因为EF不想让您一次更新两个项目。我还读到,如果任何模型都没有定义的主键,则会出现此错误。
我的应用程序设置有KendoUI网格,该网格显示了通过SQL数据库中的视图传递的相关数据。它通过名为Car
的视图模型显示的两个表是Booking
和CarsAndBookingsViewModel
Car.cs
[Key]
public int Id { get; set; }
public string Reg { get; set; }
public string Make { get; set; }
public string Model { get; set; }
Booking.cs
[Key]
public int Id { get; set; }
public DateTime BookingStart { get; set; }
public DateTime BookingEnd { get; set; }
public int? Car_Id { get; set; }
CarsAndBookingsViewModel.cs
[Key]
public int Id { get; set; }
public string Reg { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public DateTime BookingStart { get; set; }
public DateTime BookingEnd { get; set; }
public int? Car_Id { get; set; }
网格的代码如下:
@(Html.Kendo().Grid<MyProject.ViewModels.CarsAndBookingsViewModel>()
.Name("Bookings")
.Columns(columns => {
columns.Bound(c => c.Id);
columns.Bound(c => c.Car_Id);
columns.Bound(c => c.Reg);
columns.Bound(c => c.Make);
columns.Bound(c => c.Model);
columns.Bound(c => c.BookingStart).Format("{0:dd/MM/yyyy}");
columns.Bound(c => c.BookingEnd).Format("{0:dd/MM/yyyy}");
columns.Command(command => { command.Edit(); }).Width(250);
})
.Pageable()
.Sortable()
.Groupable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => {
model.Id(p => p.Id);
model.Field(p => p.Id).Editable(false);
model.Field(p => p.Car_Id).Editable(false);
})
.Read(read => read.Action("GetBookings", "Bookings"))
.Update(update => update.Action("UpdateBooking", "Booking")))
))
我们允许用户通过网格的内联编辑功能更新数据。这是UpdateBooking
方法,它传入viewmodel
,使用自动映射器映射属性,它尝试仅更新两个表的更改数据。
Automapper全局配置
Mapper.Initialize(cfg => {
cfg.CreateMap<CarsAndBookingsViewModel, Car>();
cfg.CreateMap<CarsAndBookingsViewModel, Booking>();
});
UpdateBooking方法
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateBookings([DataSourceRequest] DataSourceRequest request, BookingViewModel vm)
{
if (ModelState.IsValid)
{
//Update any changed booking info
Booking booking = unitOfWork.BookingRepository.FindSingleOrDefault(s => s.Id == vm.Car_Id);
Mapper.Map(vm, booking);
unitOfWork.BookingRepository.Update(booking);
//Update any changed car info
Car car = unitOfWork.CarRepository.FindSingleOrDefault(vm.Id);
Mapper.Map(vm, car);
unitOfWork.CarRepository.Update(car);
unitOfWork.Save();
}
return Json(new[] { vm }.ToDataSourceResult(request, ModelState));
}
我正在使用通用存储库,FindSingleOrDefault
的方法如下:
public TEntity FindSingleOrDefault(Expression<Func<TEntity, bool>> predicate)
{
return context.Set<TEntity>().Single(predicate);
}
当我的应用程序运行此更新方法时,我收到到达unitOfWork.BookingRepository.Update(booking);
时的错误消息:
The property 'Id' is part of the object's key information and cannot be modified. '
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);//Error triggers here
context.Entry(entityToUpdate).State = EntityState.Modified;
}
我不确定自己在做什么错,我确保已将键条目添加到模型和视图模型中。我没有尝试更新Id,但我认为它已随其他所有内容一起传递,因此,如果是这种情况,我会尝试进行尝试,但我不知道如何进行。任何帮助表示赞赏。