entity-framework-core - 实体框架核心插入条目,关系为 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);
}
解决方案
我已经通过使用此功能而不是旧功能解决了这个问题:
控制器.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);
}
推荐阅读
- java - SPRING BOOT 注释:是否需要
- solrcloud - 使用 SolrNet 获取 Solr 状态
- python - For循环没有使用pandas DataFrame给出预期的输出
- python - 在 tensorflow 中实现简单的线性代数运算
- facebook - 现在为 facebook 在 maltego 中转换显示
- java - 为什么我在实体 A 的仓库中得到 UnsatisfiedDependencyException 而不是在实体 B 中得到 UnsatisfiedDependencyException,而它们之间几乎没有区别?
- android - app_release.apk 的 Google oauth 中的问题,app_debug.apk 工作正常
- android - 如何将不同大小的列表项作为类参数?
- python - 编码和解码字符串('latin-1')并解析为 json
- flutter - Flutter 升级命令:Flutter 升级失败,退出代码 = 1