如何将新对象映射到具有外键的对象

问题描述

我正在使用 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; }
}