Я делаю первые шаги с 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 объекта «Область», «Тип топлива» и «Генератор» с двумя отношениями «один ко многим». Несколько генераторов могут принадлежать только к одной области / типу топлива.

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

Спасибо, что нашли время.

-1
lammy 12 Фев 2021 в 00:42

1 ответ

Лучший ответ

Оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_Generator_Area_AreaAiId"

Это означает, что вы пытаетесь вставить запись со значением в столбце внешнего ключа, которого нет во внешней таблице.

Перед установкой генератора вставьте область и тип топлива.

Попробуйте выполнить отладку, чтобы проверить значение 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; }
}
0
Michael Wang 12 Фев 2021 в 07:34