问题描述
我正在使用 Entity Framework Core 5 迈出第一步,但我正在努力弄清楚如何在由约定和流畅 API 定义的一对多关系中添加对象。我使用了这种方法:https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key#manual-configuration
我有 3 个对象“Area”、“FuelType”和“Generator”,它们具有 2 个一对多关系。多台发电机只能属于一种区域/燃料类型。
public partial class Generator
{
[Key]
public Guid Id { get; set; }
[required]
public int GeneratorAiID { get; set; }
[required]
public Area Area { get; set; }
public FuelType FuelType { get; set; }
}
我有一个 .NET Core Web API 接收 (POST) 对象集合:
public async Task<IActionResult> CreateGeneratorCollection(
IEnumerable<GeneratorForCreation> generatorCollection)
{
var generatorEntities = _mapper.Map<IEnumerable<Entities.Generator>>(generatorCollection);
foreach (var generator in generatorEntities)
{
_TradingDashboardRepository.AddGenerator(generator);
}
await _context.SaveChangesAsync();
return Ok("Added");
}
初始对象如下所示:
public partial class GeneratorForCreation
{
[required]
public int GeneratorAiID { get; set; }
[required]
public int FuelTypeId { get; set; }
[required]
public int AreaAiId { get; set; }
[required]
}
但是,如何将其映射到数据库的预期实体?
如果我使用这个:
public void AddGenerator(Generator generator)
{
if (generator == null)
{
throw new ArgumentNullException(nameof(generator));
}
_context.Generator.Add(generator);
}
我收到错误消息: INSERT 语句与 FOREIGN KEY 约束“FK_Generator_Area_AreaAiId”冲突 因为 AutoMapper 无法正确映射属性。
处理这个问题的标准方法是什么?
我的 DataContext 如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Generator>()
.HasOne(p => p.Area)
.WithMany(b => b.Generators)
.Isrequired();
modelBuilder.Entity<Generator>()
.HasOne(p => p.FuelType)
.WithMany(b => b.Generators)
.Isrequired();
感谢您抽出宝贵时间。
解决方法
INSERT 语句与 FOREIGN KEY 约束冲突 "FK_Generator_Area_AreaAiId"
这意味着您正在尝试在外键列中插入一条记录,该记录在外键列中不存在。
在插入 Generator 之前插入 Area 和 FuelType。
尝试调试以检查 AreaId 和 FuelTypeId 的值。
与此同时,RequiredAttribute
应该放在字段的顶部。
public partial class Generator
{
[Key]
[Required]
public Guid Id { get; set; }
[Required]
public int GeneratorAiID { get; set; }
[ForeignKey(nameof(FuelType))]
public int FuelTypeId { get; set; }
[ForeignKey(nameof(Area))]
public int AreaAiId { get; set; }
public Area Area { get; set; }
public FuelType FuelType { get; set; }
}
public partial class GeneratorForCreation
{
[Required]
public int GeneratorAiID { get; set; }
[Required]
public int FuelTypeId { get; set; }
[Required]
public int AreaAiId { get; set; }
}