【问题标题】:How to map a new object to an object with foreign key如何将新对象映射到具有外键的对象
【发布时间】:2021-02-11 21:42:16
【问题描述】:

我正在使用 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 个一对多关系。多个 Generator 只能属于一个 Area/FuelType。

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

感谢您抽出宝贵时间。

【问题讨论】:

  • 我可以看到我的问题被否决了。如果那个人能告诉我哪里出了问题,这样我就可以改进了,那就太好了。
  • 保存前不需要设置Area和FuelType属性吗?

标签: c# entity-framework-core entity-framework-6 asp.net-core-webapi


【解决方案1】:

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

【讨论】:

  • 您好,感谢您解决这个问题。我想我很困惑,因为我假设对“Area”/“FuelType”对象的引用会自动公开该对象的 ForeignKey。在之前的尝试中,我也没有使用数据注释。谢谢你。现在已经很清楚了。
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2017-03-06
  • 2020-06-23
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多