如何解决“属性'Id'是对象密钥信息的一部分并且无法修改”的消息?

时间:2018-09-03 10:07:34

标签: c# entity-framework kendo-ui automapper

我已经进行了一些搜索,并且我了解这是出于安全原因,因为EF不想让您一次更新两个项目。我还读到,如果任何模型都没有定义的主键,则会出现此错误。

我的应用程序设置有KendoUI网格,该网格显示了通过SQL数据库中的视图传递的相关数据。它通过名为Car的视图模型显示的两个表是BookingCarsAndBookingsViewModel

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,但我认为它已随其他所有内容一起传递,因此,如果是这种情况,我会尝试进行尝试,但我不知道如何进行。任何帮助表示赞赏。

0 个答案:

没有答案