Entity framework core 具有1对多关系的实体框架核心插入项

Entity framework core 具有1对多关系的实体框架核心插入项,entity-framework-core,Entity Framework Core,让我解释一下, 我有两张桌子:燃料和汽车。 一辆车可以有多个燃油入口,一个燃油入口有一辆车。所以这是一个正常的1米关系 但当我尝试插入新燃油并选择已存在的车辆时,这是一个例外: Duplicate entry '5' for key 'vehicle.PRIMARY' 当我尝试创建一个新的燃料入口,而不是将燃料入口链接到现有车辆时,它尝试创建一个新的燃料入口。事实上,如果我使用postmap,而不是使用现有的车辆,我会放置一辆新的,它会创建燃油和车辆入口 这是我实际使用的代码: 燃油等级: p

让我解释一下, 我有两张桌子:燃料和汽车。 一辆车可以有多个燃油入口,一个燃油入口有一辆车。所以这是一个正常的1米关系

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

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>();
}
公共级车辆
{
[关键]
公共int id{get;set;}
[必需,最大长度(7),最小长度(7)]
公共字符串板{get;set;}
[JsonIgnore,反向财产(“车辆”)]
公共ICollection{get;set;}=new HashSet();
}
数据库上下文:

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);
    }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasKey(bc=>new{bc.journeyId,bc.addressId});
modelBuilder.Entity()
.HasOne(卑诗省=>卑诗省旅程)
.WithMany(b=>b.journeyAddress)
.HasForeignKey(bc=>bc.journeyId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasOne(bc=>bc.address)
.WithMany(c=>c.JourneyAddress)
.HasForeignKey(bc=>bc.addressId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasOne(c=>c.vehicle)
.有许多(e=>e.燃料)
.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);
    }
公共异步任务

我使用此函数而不是旧函数解决了问题:

控制器

        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);
    }
公共异步任务PostFuel(Fuel)
{
var vehicle=_context.vehicle.SingleOrDefault(t=>t.id==fuel.vehicleId);
燃料。车辆=车辆;
_回购增加(燃料);
var save=等待_repo.SaveAsync(燃料);
返回CreateDataAction(“GetFuel”,新的{id=fuel.id},fuel);
}