Позвольте мне объяснить, у меня есть 2 таблицы: топливо и автомобиль. 1 транспортное средство может иметь больше записей топлива, одна запись топлива имеет 1 автомобиль. Так что это нормальные отношения 1 - M.
Но когда я пытаюсь вставить новое топливо и выбрать уже существующее транспортное средство, это исключение:
Duplicate entry '5' for key 'vehicle.PRIMARY'
Это так, когда я попытайтесь создать новую запись о топливе, вместо этого связав запись о топливе с существующей машиной, она попытается создать новую. Фактически, если я использую postmap и вместо существующего транспортного средства я добавляю новое, он создает запись Fuel и Vehicle.
Это код, который я на самом деле использую: Класс топлива:
public class Fuel
{
[Key]
public int id { get; set; }
public DateTime date { get; set; }
public float cost { get; set; }
[ForeignKey("vehicleId")]
public virtual Vehicle vehicle { get; set; }
public int vehicleId { get; set; }
public float startKm { get; set; }
public float endKm { get; set; }
public float liter { get; set; }
public float average { get; set; }
}
Класс транспортного средства:
public class Vehicle
{
[Key]
public int id { get; set; }
[Required, MaxLength(7), MinLength(7)]
public string plate { get; set; }
[JsonIgnore, InverseProperty("vehicle")]
public ICollection<Fuel> Fuels { get; set; } = new HashSet<Fuel>();
}
DatabaseContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<JourneyAddress>()
.HasKey(bc => new { bc.journeyId, bc.addressId });
modelBuilder.Entity<JourneyAddress>()
.HasOne(bc => bc.journey)
.WithMany(b => b.journeyAddress)
.HasForeignKey(bc => bc.journeyId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<JourneyAddress>()
.HasOne(bc => bc.address)
.WithMany(c => c.JourneyAddress)
.HasForeignKey(bc => bc.addressId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<Fuel>()
.HasOne(c => c.vehicle)
.WithMany(e => e.Fuels)
.HasForeignKey(c => c.vehicleId)
.OnDelete(DeleteBehavior.Cascade);
}
Контроллер:
public async Task<ActionResult<Fuel>> PostFuel(Fuel fuel)
{
_repo.Add(fuel);
var save = await _repo.SaveAsync(fuel);
return CreatedAtAction("GetFuel", new { id = fuel.id }, fuel);
}
POSTMAP с существующим транспортным средством
POSTMAP с новым автомобилем