Entity Framework Core Вставить запись с отношением 1 ко многим - PullRequest
0 голосов
/ 29 января 2020

Позвольте мне объяснить, у меня есть 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 с новым автомобилем

1 Ответ

0 голосов
/ 31 января 2020

Я решил проблему, используя эту функцию вместо старой:

Controller.cs

        public async Task<ActionResult<Fuel>> PostFuel(Fuel fuel)
    {
        var vehicle = _context.Vehicle.SingleOrDefault(t => t.id == fuel.vehicleId);
        fuel.vehicle = vehicle;
        _repo.Add(fuel);
        var save = await _repo.SaveAsync(fuel);

        return CreatedAtAction("GetFuel", new { id = fuel.id }, fuel);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...