Entity Framework Core Put Операция не работает - PullRequest
0 голосов
/ 29 августа 2018

Я получаю

Ошибка необработанного исключения: свойство 'Id' для типа объекта 'Автомобиль' является частью ключа и поэтому не может быть изменено или помечено как измененное. Для изменения принципала существующей сущности с идентифицирующим внешним ключом сначала удалите зависимую и вызовите «SaveChanges», затем свяжите зависимую с новым принципалом. Свойство «Id» для типа сущности «Vehicle» является частью ключа и поэтому не может быть изменено. или помечены как измененные. Чтобы изменить принципал существующего объекта с идентифицирующим внешним ключом, сначала удалите зависимого и вызовите «SaveChanges», затем свяжите зависимого с новым принципалом

Вот мой пут API:

[HttpPut("{id}")]
public IActionResult UpdateVehicle(int id, [FromBody] SaveVehicleResource vehicleResource)
{
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        var vehicle = context.Vehicles.Include(v => v.Features).SingleOrDefault(v => v.Id == id);

        if (vehicle == null)
            return NotFound();

        mapper.Map(vehicleResource, vehicle);
        vehicle.LastUpdate = DateTime.Now;

        context.SaveChanges();

        var result = mapper.Map<Vehicle, SaveVehicleResource>(vehicle);

        return Ok(result);
}

Вот DbContext:

public class VegaDbContext : DbContext
{
    public DbSet<Make> Makes { get; set; }
    public DbSet<Feature> Features { get; set; }
    public DbSet<Vehicle> Vehicles { get; set; }
    public DbSet<Model> Models { get; set; }

    public VegaDbContext(DbContextOptions<VegaDbContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<VehicleFeature>().HasKey(vf => new { vf.VehicleId, vf.FeatureId });
    }
}

Vehicle класс:

public class Vehicle
{
    public int Id { get; set; }
    public int ModelId { get; set; }
    public Model Model { get; set; }
    public bool IsRegistered { get; set; }
    public Contact Contact { get; set; }
    public ICollection<VehicleFeature> Features { get; set; }
    public DateTime LastUpdate { get; set; }
    public Vehicle()
    {
        Features = new Collection<VehicleFeature>();
    }
}

VehicleFeature класс:

public class VehicleFeature
{
    public int VehicleId { get; set; }
    public int FeatureId { get; set; }
    public Vehicle Vehicle { get; set; }
    public Feature Feature { get; set; }
}

1 Ответ

0 голосов
/ 29 августа 2018

Отказ от ответственности: действительно похоже, что вы используете AutoMapper. Итак, давайте посмотрим на вашу конфигурацию AutoMapper. В частности, посмотрите, можете ли вы найти там что-то вроде .CreateMap<Vehicle, SaveVehicleResource>.

Происходит одно из этих двух событий:

  1. Ваш AutoMapper настроен на явное CreateMap для этих классов и включает в себя оператор, аналогичный .ForMember(x => x.Id, x.MapFrom(y => y.Id))
  2. Ваш AutoMapper не настроен явно, что означает, что он находит свойство .Id, потому что оба класса определяют его с одинаковым именем. Вы должны явно игнорировать этот член.

Независимо от того, что из этого произошло, вы должны указать AutoMapper игнорировать это свойство.

CreateMap<Vehicle, SaveVehicleResource>(...)
    .ForMember(x => x.Id, y => y.Ignore());
...