Microsoft.Data.SqlClient.SqlException (0x80131904): инструкция INSERT конфликтует с FK

Я создаю POST API для вставки данных в мою таблицу Walks, и у него есть две таблицы ForeignKey с трудностями и регионами, и это моя модель Walk.

public class Walk
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public double LengthInKm { get; set; }
    public string? WalkImageUrl { get; set; }
    
    public Guid DifficultyId { get; set; }
    public Guid RegionId { get; set; }
   

    public Difficulty Difficulty { get; set; }
    public Region Region { get; set; }
}

Я не знаю, почему происходит конфликт, потому что я проверил всю таблицу и модель. Я засеял данные в разделе «Регионы и сложность», но они все еще не работают.

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions options) : base(options)
    {
        
    }
    public DbSet<Difficulty> Difficulties { get; set; }
    public DbSet<Region> Regions { get; set; }
    public DbSet<Walk> Walks { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        var difficuties = new List<Difficulty>()
        {
            new Difficulty()
            {
                Id = Guid.Parse("ce6a68d1-b490-4d38-a162-21ce3c371bfa"),
                Name = "Easy"
            },
            new Difficulty()
            {
                Id = Guid.Parse("f5a9b531-a099-493a-a05a-81c95627adbc"),
                Name = "Medium"
            },
            new Difficulty()
            {
                Id = Guid.Parse("261f60b6-efa7-426d-8ea4-7b34cf9beba1"),
                Name = "Hard"
            }
        };
        modelBuilder.Entity<Difficulty>().HasData(difficuties);


        var regions = new List<Region>()
        {
            new Region
            {
                Id = Guid.Parse("3a5d1dd2-abc5-412b-9e3d-c1b2648a228f"),
                Name = "Ha Noi",
                Code = "HN",
                RegionImageUrl = ""
            },
            new Region
            {
                Id = Guid.Parse("22715dff-abad-4263-837a-9e97d80fa86d"),
                Name = "Sai Gon",
                Code = "SG",
                RegionImageUrl = ""
            },
             new Region
             {
                 Id = Guid.Parse("bc562c11-d7b2-478b-a75d-56a8da71b85a"),
                 Name = "Da Nang",
                 Code = "DN",
                 RegionImageUrl = ""
             },
             new Region
             {
                 Id = Guid.Parse("76675766-473f-4d1d-aba3-e4673f805d0c"),
                 Name = "Ninh Binh",
                 Code = "NB",
                 RegionImageUrl = ""
             }
        };
        modelBuilder.Entity<Region>().HasData(regions);
   
    }
}

Это мой контекст базы данных, в который я заполнил некоторые данные.

Это мой контроллер

private readonly IMapper mapper;
private readonly IWalkRepository walkRepository;

public WalksController(IMapper mapper, IWalkRepository walkRepository)
{
    this.mapper = mapper;
    this.walkRepository = walkRepository;
}
[HttpPost]
public async Task<IActionResult> Create([FromBody] CreateAndUpdateWalkDTO createAndUpdateWalkDTO)
{
    // map from createDTO to model
    var createWalkModel = mapper.Map<Walk>(createAndUpdateWalkDTO);

    await walkRepository.CreateAsync(createWalkModel);

    //map from model to dto to return
    return Ok(mapper.Map<WalkDTO>(createWalkModel));
}

Создание и обновление DTO

public class CreateAndUpdateWalkDTO
{
    public string Name { get; set; }
    public string Description { get; set; }
    public double LengthInKm { get; set; }
    public string? WalkImageUrl { get; set; }
    public Guid DiffcultyId { get; set; }
    public Guid RegionId { get; set; }


}

Прогулка по DTO

public class WalkDTO
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public double LengthInKm { get; set; }
    public string? WalkImageUrl { get; set; }
    public Guid DiffcultyId { get; set; }
    public Guid RegionId { get; set; }
}

Мой объект, который я отправляю от клиента

{
  "name": "Name",
  "description": "This is description",
  "lengthInKm": 10,
  "walkImageUrl": null,
  "diffcultyId": "f5a9b531-a099-493a-a05a-81c95627adbc",
  "regionId": "3a5d1dd2-abc5-412b-9e3d-c1b2648a228f"
}

Пожалуйста, не публикуйте изображения кода. Вы правильно опубликовали первый фрагмент кода, поэтому я не уверен, почему вы не разместили правильно и второй.

jmcilhinney 09.05.2024 05:03

мне очень жаль, я отредактировал свое сообщение, сэр

Phạm Trọng Nghĩa 09.05.2024 05:21

Я могу ошибаться, но подозреваю, что это потому, что вы используете код для генерации идентификаторов, а не констант. Я видел нечто подобное, используя DateTime.Now, хотя на самом деле это значение каждый раз было разным, возможно, это не одно и то же. Не знаю, как это обойти для значений GUID.

jmcilhinney 09.05.2024 05:27

Действительно ли имеет смысл использовать GUID для этих идентификаторов? Возможно, это то, что вы не можете изменить сейчас, но обычно вам следует использовать GUID только в том случае, если идентификаторы генерируются в нескольких разных системах. Вероятность дублирования GUID очень мала даже в этом сценарии, тогда как целым числам потребуется назначать разные диапазоны для сохранения уникальности. Однако использование GUID неэффективно, поэтому, если вы генерируете ключи только в одной системе, особенно если это жестко закодированные данные, которые не будут добавлены позже, вам действительно следует использовать целочисленные идентификаторы.

jmcilhinney 09.05.2024 05:30

потому что это не константы, поэтому мне нужно жестко закодировать идентификатор и проанализировать его в Guid. Когда я позвонил API, я скопировал два FK из базы данных.

Phạm Trọng Nghĩa 09.05.2024 05:36

Как вы думаете, мне следует использовать другой тип идентификатора, например Int?

Phạm Trọng Nghĩa 09.05.2024 05:37

Позвольте мне попробовать, и я оставлю отзыв позже! Спасибо, сэр

Phạm Trọng Nghĩa 09.05.2024 05:38

Независимо от этой проблемы, вы всегда должны использовать целочисленный тип данных для вашего ПК, если это возможно. Как я уже сказал, GUID гораздо менее эффективны, поэтому их следует использовать только в случае необходимости. Могут быть и другие причины, но наиболее распространенной причиной использования GUID в качестве ПК является их создание на нескольких клиентских системах, а не на одном сервере.

jmcilhinney 09.05.2024 05:39

Если вы собираетесь придерживаться GUID, это настоящий удар в темноту, но попробуйте использовать конструктор Guid вместо Guid.Parse.

jmcilhinney 09.05.2024 05:40

Ошибка ясно указывает на то, что используемый FK не является значением в поле первичного ключа внешней таблицы. Убедились ли вы, что ваша таблица заполняется так, как ожидалось в соответствии с вашим методом заполнения?

Stephen Wrighton 09.05.2024 05:42

@jmcilhinney - по сути нет никакой разницы между конструктором и методом статического анализа. stackoverflow.com/questions/6915966/…

Stephen Wrighton 09.05.2024 05:48

Я проверил все данные в двух таблицах с двумя засеянными данными, и они оправдали мои ожидания.

Phạm Trọng Nghĩa 09.05.2024 05:51

@StephenWrighton, я думал, что это так, но хватался за соломинку. Как оказалось, я на самом деле неправильно прочитал вопрос и пытался решить не ту задачу. Ваш первый комментарий заставил меня осознать свою ошибку.

jmcilhinney 09.05.2024 05:52

@PhạmTrọngNghĩa, прошу прощения, но я совершенно неправильно понял проблему, поэтому, хотя вам все равно следует изменить тип данных идентификатора, если это возможно, все остальное, что я сказал, не имеет значения. Я думал, что проблема заключалась в вставке исходных данных, но, похоже, на самом деле проблема связана с вставкой данных, связанных с этими исходными записями. На самом деле вы не показали нам, где вы пытаетесь выполнить вставку, которая не удалась, поэтому мы не можем понять, что с ней не так. Я предлагаю вам написать тестовый код с жестко запрограммированными значениями FK, скопированными из этих исходных данных.

jmcilhinney 09.05.2024 05:55

@jmcilhinney, нет проблем, я очень благодарен, что ты мне помогаешь. Это мой объект, который я отправляю от клиента для создания: ``` { "name": "имя примера", "description": "это описание", "lengthInKm": 10, "walkImageUrl": null, "diffcultyId" : "ce6a68d1-b490-4d38-a162-21ce3c371bfa", "regionId": "22715dff-abad-4263-837a-9e97d80fa86d" } ```

Phạm Trọng Nghĩa 09.05.2024 06:03

и это мой контроллер ` [HttpPost] public async Task<IActionResult> Create([FromBody] CreateAndUpdateWalkDTO createAndUpdateWalkDTO) { // сопоставляем из createDTO с моделью var createWalkModel = mapper.Map<Walk>(createAndUpdateWalkDTO); ждут walkRepository.CreateAsync(createWalkModel); // сопоставляем модель с dto, чтобы вернуть return Ok(mapper.Map<WalkDTO>(createWalkModel)); } `извините, я не знаю, как создать поле кода в комментарии :(

Phạm Trọng Nghĩa 09.05.2024 06:04

это мой исходный код github.com/phamnghiascode/Nghia

Phạm Trọng Nghĩa 09.05.2024 06:09

Не публикуйте код в комментариях или ссылках на код. Пожалуйста, отредактируйте свой вопрос и предоставьте там всю необходимую информацию. В отличие от форума, где сообщения обычно не следует редактировать, если они не содержат ошибок, вопросы SO следует редактировать, если требуется новая информация. Вопрос всегда должен быть источником истины. Никто не должен читать комментарии, чтобы понять вопрос.

jmcilhinney 09.05.2024 06:47

@jmcilhinney извините, сэр, я отредактировал свой вопрос и добавил еще немного кода

Phạm Trọng Nghĩa 09.05.2024 07:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
19
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После многих дней попыток я понял, что моя глупость возникла из-за того, что я создал и отправил не тот объект. Это неправильный объект

{
  "name": "Name",
  "description": "This is description",
  "lengthInKm": 10,
  "walkImageUrl": null,
  "diffcultyId": "f5a9b531-a099-493a-a05a-81c95627adbc",
  "regionId": "3a5d1dd2-abc5-412b-9e3d-c1b2648a228f"
}

и проблема в орфографической ошибке «diffcultyId». Это должен быть «diffcultyId»

Другие вопросы по теме