首页 > 解决方案 > 实体框架核心插入条目,关系为 1 到多个

问题描述

让我解释一下,我有 2 个表:燃料和车辆。1 辆车可以有更多的燃料条目,一个燃料条目有 1 辆车。所以这是一个正常的1-M关系。

但是当我尝试插入新燃料并选择已经存在的车辆时,这是例外:

Duplicate entry '5' for key 'vehicle.PRIMARY'

就像当我尝试创建一个新的燃料条目,而不是将燃料条目链接到现有车辆时,它会尝试创建一个新的。事实上,如果我使用 postmap,而不是使用现有的车辆,我会放一辆新的,它会同时创建燃料和车辆条目。

这是我实际使用的代码:燃料类:

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>();
}

数据库上下文:

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

标签: entity-framework-core

解决方案


我已经通过使用此功能而不是旧功能解决了这个问题:

控制器.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);
    }

推荐阅读